Avatar billede deeflate Nybegynder
03. oktober 2005 - 23:36 Der er 7 kommentarer og
1 løsning

N:M/M:M - hent post som IKKE optræder m. relation i samlingstabel

Jeg har observeret flere nye grå hår her til aften, og har nok eftehånden stirret mig blind på det her, så nu er det tid til ekspert-hjælp...


Problem:
---------------------------


Jeg har brug for at hente to sæt data ud fra nogle relaterede tabeller, og det ene sæt driller en del.

Relation er nogle til mange eller mange til mange (alt efter hvad man kalder det, vel sagtens);
tabel c (med nøglen cid) og m (med nøglen mid) bindes sammen af tabel b, som indeholder forskellige kombinationer af id'erne cid og mid fra tabellerne c og m

- ikke alle forekomster af cid og mid optræder i tabel b, og det er dette, der giver mig problemer.


Det første sæt data, som jeg skal hente, skal bestå af alle forekomster af cid (samt lidt blandet godt fra posten i c) som optræder i b sammen med en bestemt mid.

Til det formål bruger jeg følgende sql-sætning:

SELECT c.cid, c.campID, c.campName FROM (c LEFT JOIN b ON c.cid=b.cid) WHERE b.mid = " & rs("mid")

Og det virker, som det skal - ingen klager.

Men...

det andet sæt, jeg skal hente, skal bestå af alle forekomster af cid som IKKE optræder i b sammen med en bestemt mid - men de behøver ikke at optræde i b overhovedet...

Jeg har prøvet lidt forskelligt, blandt andet, den jeg troede var åbenlys, nemlig:

SELECT c.cid, c.campID, c.campName FROM (c LEFT JOIN b ON c.cid=b.cid) WHERE b.mid <> " & rs("mid")


Så kommer der de forekomster af cid med som optræder i b (dog ikke sammen med mid'en, og det er da altid noget), men jeg har også brug for de forekomster fra c.cid som ikke er koblet sammen med nogen mid gennem tabel b.


---------------------------


Er der nogen forslag?

Eller er der nogen, der kan se, hvad fejlen evt. er i mit setup?

Jeg sover med fingrene krydset i nat, og håber på svar i morgen :)

Jeg skal gerne uddybe, hvis der mangler info - kan godt se, at det måske ser lidt forvirrende ud - er sikkert også derfor jeg selv roder rundt i det... - og jeg mangler lidt begreber, tror jeg, til at forklare i dybden ;)

Sig til, hvis den er sværere end til de 60 (og også gerne, hvis den er lettere ;) ), så passer jeg til.
Avatar billede deeflate Nybegynder
03. oktober 2005 - 23:39 #1
P.S. Jeg er ret rusten i det her, so be gentle... ;)
Avatar billede softspot Forsker
03. oktober 2005 - 23:46 #2
prøv evt.

SQL = "SELECT c.cid, c.campID, c.campName " & _
"FROM (c LEFT JOIN b ON c.cid=b.cid) " & _
"WHERE b.mid <> " & rs("mid") & " OR b.mid IS NULL"
Avatar billede deeflate Nybegynder
04. oktober 2005 - 07:47 #3
Hmm... det virker jo umiddelbart fornuftigt på skrift, men ved test ser jeg, at to af de returnerede poster også optræder sammen med min mid i b :(

Hver cid optræder flere gange i tabel b, og jeg skal kun have dem, som på intet tidspunkt optræder sammen med den valgte mid (og kun éen af hver) - altså jeg skal have det omvendte af sæt 1.
Avatar billede davidfossil Nybegynder
04. oktober 2005 - 08:57 #4
Det første først - i den første sætning burde du bruge INNER JOIN, resultatet bliver det samme:
SELECT c.cid, c.campID, c.campName FROM (c INNER JOIN b ON c.cid=b.cid) WHERE b.mid = " & rs("mid")

Den anden ville jeg løse som følger:

SELECT *
FROM c
WHERE NOT EXISTS
(
  SELECT FROM b
  WHERE b.cid = c.cid
  AND b.mid = " & rs ("mid") & "
)

Du kan bare fjerne mine linjeskift - de er blot for at gøre det mere læseligt :)
Hvis ikke dette virker, så skriv lige hvilken database vi har med at gøre - dette spørgsmål burde vel egentlig ligge under databaser...
Avatar billede davidfossil Nybegynder
04. oktober 2005 - 08:58 #5
der mangler lige en * i det jeg skrev ... mellem SELECT og FROM :)
Avatar billede deeflate Nybegynder
04. oktober 2005 - 13:57 #6
Skal bare lige have styr på noget:
INNER JOIN henter kun de poster, som har en match i begge tabeller, ikke?
Så det vil jo være fint i min første sætning, ja.

WHERE NOT EXISTS kender jeg ikke, men det lyder MEGET interessant. Jeg kan desværre ikke komme til at teste lige nu (sidder på arb.), men jeg vender tilbage til dig senere :) Kommer nok hjem omkring kl. 20.

Ang. spørgsmålets placering: det har du sikkert også ret i - lagde det her, fordi jeg bruger det på en asp-side, men det er vel egentlig spørgsmålet uvedkommende. Tænkte jeg ikke lige på. Beklager. Bør jeg flytte det, tror du?
Avatar billede deeflate Nybegynder
04. oktober 2005 - 20:42 #7
Så er der testet, og det virker smukt :)

Tak for hjælpen! Hvis du lægger et svar, så skal jeg med glæde lægge point.

Og sig endelig til, hvis du hellere vil ordne det i en anden kategori...
Avatar billede davidfossil Nybegynder
04. oktober 2005 - 22:48 #8
Super!

Et INNER JOIN kræver ganske rigtigt at der er match begge tabeller, mens LEFT/RIGHT (OUTER) JOIN tager udgangspunkt i den ene tabel, og lader felterne fra den anden tabel være NULL i sit result, hvis der ingen rækker er i denne.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester