09. februar 2004 - 15:13Der er
7 kommentarer og 1 løsning
Omskrivning af INNER JOIN for 3 tabeller i Oracle 8
Når man har 2 tabeller, T1 og T2, skal man i Oracle 8 omskrive en INNER JOIN som
SELECT T1.Felt1, T2.Felt9 FROM T1, T2 WHERE T1.Felt5 = T2.Felt5 AND T1.Felt1 = "XX" AND T2.Felt9 = "YY"
men hvad gør man, når tabel T3 skal joines også?
Jeg har set beskrevet, at man gør sådan:
SELECT * FROM T3, (SELECT T1.Felt1, T2.Felt9 FROM T1, T2 WHERE T1.Felt5 = T2.Felt5 AND T1.Felt1 = "XX" AND T2.Felt9 = "YY") Z WHERE T3.Felt99 = Z.Felt1
men det kan jeg på ingen måde få til at virke.
Hvordan joiner man 3 eller flere tabeller med mulighed for at selektere felter fra alle tabellerne?
SELECT T1.Felt1, T2.Felt9, T3.Felt4 FROM T1, T2, T3 WHERE T1.Felt5 = T2.Felt5 AND T1.Felt6 = T3.Felt2 AND T1.Felt1 = "XX" AND T2.Felt9 = "YY" AND T3.Felt4 = "ZZ"
Tænk - så enkelt og elegant!!! Virker perfekt. Hvorfor mon den mærkelige omskrivning, som jeg har set som et 'svar' på en internetside? Mange, mange tak!
Bare lige fordi jeg ikke kan holde kæft: Der kan faktisk være situationer hvor det er fordelagtigt at lave en subquery fremfor en almindelig join - men det er sjældent.
Ovenstående "underlighed" kunne f.eks. hænge sammen med brugen af en rulebased optimizer hvor man vil tvinge den til at lave en join før en anden.
Men med nyere Oracle installationer vil man næsten altid køre en cost-based optimizer - og så kan den selv finde ud af den slags, blot indeks-statistikkerne er opdaterede :-)
select * from table1 t1, table2 t2 where t1.pk = t2.fk (+)
select * from table1 t1, table2 t2 where t1.pk (+) = t2.fk
Jeg mener at LEFT er når +'et står til højre og omvendt, men er ikke helt sikker.
Synes godt om
Ny brugerNybegynder
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.