25. april 2005 - 14:59Der er
10 kommentarer og 1 løsning
undgå dubletter på left join tabel
Jeg ved det! der er flere spørgsmål omkring dette, men jeg har ikke fundet lige min situation.
jeg har en tabel tisfc001 der med en left join knytter table tisfc010
altså sådan noget som dette... select tisfc001.pdno, tisfc010.cwoc from tisfc001 left outer join tisfc010 ON tisfc001.pdno = tisfc010.pdno
tisfc010 har flere records der matcher pdno feltet
Hvad jeg behøver er blot at vide om feltet tisfc010.cwoc i blot een af de mange records har værdien x. Hvis ja skal tisfc001.pdno vises på en liste, ellers ikke. Når jeg bruger min left outer join får jeg lige så mange linier vist som der er records i tisfc010 med tisfc010=x.
Men bemærk at du så ikke umiddelbart kan vælge felter fra tisfc010, hvis du ikke vil have dubletter. Hvis du vælger tisfc010.cwoc skal du også GROUP'e på den:
GROUP BY tisfc001.pdno, tisfc010.cwoc
- og så vil der komme dubletter hvis tisfc010.cwoc varierer.
Hov, nu har jeg lige læst dit spørgamål ordentligt, og hvis du bare vil have en liste over poster i tisfc001 som har relaterede poster i tisfc010, så kan du bruge inner join:
SELECT tisfc001.pdno FROM tisfc001 INNER JOIN tisfc010 ON tisfc001.pdno = tisfc010.pdno GROUP BY tisfc001.pdno
Eller du kan benytte den mere intutive:
SELECT tisfc001.pdno FROM tisfc001 WHERE tisfc001.pdno IN (SELECT tisfc010.pdno FROM tisfc010)
- Men jeg vil tro at den sidste er tungere at køre
OKAY. Klart med INNER JOIN. Det overså jeg i eksemplet.
Men, men Jeg har i min virkelige SQL 20 felter fra 3 tabeller som joines, skal jeg så virkelig have dem alle med i en GROUP BY for at få det til at virke?
Du skal ikke bekymre dig så meget over at din SQL bliver "lang", det er ikke det der belaster databasen. Men det er lidt belastende for programmøren :o)
En anden mulighed er at du ikke undgår dubletter, men lever med dem.
Hvis det nu var asp, og jeg skulle loope gennem et recordset med dubletter, men f.eks. kun vil skrive en ny linie for hver "nye" post, så ville jeg gøre sådan:
Dim lastID lastID = 0
do while blabla if lastID <> Rec("ID") then 'Udskriv linie lastID = Rec("ID") end if 'MoveNext eller noget ... loop
Jo jeg forstår. Og ja, det er ASP jeg sidder med, men jeg foretrækker at ramme så præcist som muligt med SQL kaldet. Jeg går ud fra det er hurtigst/performer bedst. Ellers har jeg også gjort det på din denne måde flere gange.
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.