FAQ |
Kalender |
![]() |
#1 | |||
|
||||
Klarade millennium-buggen
|
Antag att jag har 3 tabeller; 2 st med diverse data samt 1 kopplingstabell mellan dessa.
Undrar om någon vänlig själ kan visa hur man söker fram data som visar vart det _saknas_ kopplingar. Här antar jag alltså att ett normalfall är att alla rader i tabell 1 är kopplade mot alla rader i tabell 2 (via tabell 3). Hur söker man ut något som "saknas" till skillnad från det vardagliga där man faktiskt selectar fram saker som existerar? :unsure: |
|||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Mycket flitig postare
|
outer join och kolla så att "injoinad" kolumn är null.
|
||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Klarade millennium-buggen
|
Men det är ju kopplingstabellen som pekar ut rader i tabell 1 och tabell 2. Vad ska jag joina på för att hitta saknade kopplingar?
|
|||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Klarade millennium-buggen
|
Använd WHERE NOT IN på något sätt, borde fungera.
Kod:
SELECT ID FROM tabell2 WHERE NOT IN (SELECT ... FROM Tabell2) |
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Mycket flitig postare
|
Du kan ju alltid göra en LEFT JOIN:
Kod:
SELECT tabell1.*,tab1_id FROM tabell1 LEFT JOIN koppling ON koppling.tab1_id=tabell1.id WHERE tab1_id IS NULL (enligt den här principen borde du få ut det du är ute efter, du kan ju fila på det för att få ut allt i en query eller hur du nu vill ha det) |
|||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Klarade millennium-buggen
|
Om vi antar att tabell 1 har 10 rader samt tabell 2 har 1000 rader så kan det alltså finnas 10000 rader i kopplingstabellen (alla till alla).
Ponera att jag tar bort 1 rad ur kopplingstabellen, så kanske problemet klarnar varför jag har svårt att se vad som saknas... eller? :/ |
|||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Mycket flitig postare
|
Citat:
Vad är det du letar efter? Misstänker du att id:n är refererade till i kopplingstabellen som saknas i tabell 1 eller 2, eller letar du efter rader som finns i tabellerna men inte är "kopplade"? Försök formulera vad du är ute efter lite noggrannare! Det har ju kommit flera förslag på hur du kan gå till väga rent sgl-mässigt här (mer detaljerat kan det inte bli om du inte lägger upp tabellerna i sin helhet och talar om exakt vad det är du söker efter…). Om du tar bort en rad så får du ju ett null-värde som du kan söka efter när du gör en outerjoin, vad är det mer du behöver? |
|||
![]() |
![]() |
![]() |
#8 | |||
|
||||
Klarade millennium-buggen
|
Räkneexemplet var till för att visa att man med en join får "träff" just för att det existerar en kopplingar öht, dock så vet man ju inte att samtliga kopplingar finns.
Riktigt exempel: Ett översättningsscenario där du har tabeller som följer: 1) Languages (språk) 2) Phrases (engelska fraser) 3) Translation (en koppling mellan ovanstående (pekar mot id i båda tabellerna). Innehåller också det översatta ordet på det aktuella språket) Mer data än så behövs inte för att förstå problemet. ![]() Jag måste ha en sql för att leta efter ord som saknar översättning, oavsett vilken Phrase eller Language det gäller. Join-exemplen ni gav ger ju "träff" bara en phrase har minst en översättning på ett språk, och det är inte riktigt vad jag är ute efter. b.n: Det finns inga dubletter i kopplingstabellen. |
|||
![]() |
![]() |
![]() |
#9 | |||
|
||||
Klarade millennium-buggen
|
Ingen som vill försöka? :/
|
|||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Medlem
|
SELECT id FROM koppling WHERE id NOT IN(SELECT id FROM tabell_a) AND id NOT IN(SELECT id FROM tabell_b)
|
||
![]() |
![]() |
Svara |
|
|