Kom ihåg mig?
Home Menu

Menu


Sql fråga

 
Ämnesverktyg Visningsalternativ
Oläst 2007-09-03, 18:14 #1
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
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:
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-09-03, 18:51 #2
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
outer join och kolla så att "injoinad" kolumn är null.
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-09-03, 20:34 #3
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
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?
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-09-03, 21:03 #4
allstars allstars är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Apr 2006
Inlägg: 2 126
allstars allstars är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Apr 2006
Inlägg: 2 126
Använd WHERE NOT IN på något sätt, borde fungera.

Kod:
SELECT ID FROM tabell2 WHERE NOT IN (SELECT ... FROM Tabell2)
allstars är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-09-03, 23:06 #5
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
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)
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-09-04, 11:04 #6
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
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? :/
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-09-04, 12:41 #7
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
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?
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-09-04, 16:11 #8
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-09-12, 23:07 #9
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
Ingen som vill försöka? :/
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-09-13, 04:26 #10
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
SELECT id FROM koppling WHERE id NOT IN(SELECT id FROM tabell_a) AND id NOT IN(SELECT id FROM tabell_b)
Jake.Nu är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 23:08.

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