WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Sql fråga (https://www.wn.se/forum/showthread.php?t=23346)

Robert 2007-09-03 18:14

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:

eg0master 2007-09-03 18:51

outer join och kolla så att "injoinad" kolumn är null.

Robert 2007-09-03 20:34

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?

allstars 2007-09-03 21:03

Använd WHERE NOT IN på något sätt, borde fungera.

Kod:

SELECT ID FROM tabell2 WHERE NOT IN (SELECT ... FROM Tabell2)

martine 2007-09-03 23:06

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
för att få alla rader i tabell1 som inte är kopplade.

(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)

Robert 2007-09-04 11:04

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? :/

martine 2007-09-04 12:41

Citat:

Originally posted by Robert@Sep 4 2007, 11:04
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? :/

Med räkneexempel kommer du oftast inte långt, även om antalet stämmer kan du ha referenser till rader som saknas i ena, andra eller båda tabellerna eller dubletter (om du inte har index som garanterar unikitet, vilket du förvisso borde ha) i "kopplingstabellen".

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?

Robert 2007-09-04 16:11

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.

Robert 2007-09-12 23:07

Ingen som vill försöka? :/

Jake.Nu 2007-09-13 04:26

SELECT id FROM koppling WHERE id NOT IN(SELECT id FROM tabell_a) AND id NOT IN(SELECT id FROM tabell_b)


Alla tider är GMT +2. Klockan är nu 02:01.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson