Avatar billede Kim Neesgaard Seniormester
09. februar 2004 - 15:13 Der 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?
Avatar billede proaccess Nybegynder
09. februar 2004 - 15:16 #1
Du burde da kunne:

SELECT T1.Felt1, T2.Felt9, T3.Felt4
FROM T1, T2, T3
WHERE T1.Felt1 = "XX" AND T2.Felt9 = "YY" AND T3.Felt4 = "ZZ"
Avatar billede Kim Neesgaard Seniormester
09. februar 2004 - 15:20 #2
Skal det ikke angives, hvilke felter der joines på, som i eksemplet med 2 tabeller?
Avatar billede proaccess Nybegynder
09. februar 2004 - 15:24 #3
Jo det tager du også med i din WHERE...

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"
Avatar billede Kim Neesgaard Seniormester
09. februar 2004 - 15:40 #4
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!
Avatar billede proaccess Nybegynder
09. februar 2004 - 15:47 #5
Nogen skal absolut gøre alt så indviklet som muligt...  Jeg er glad for at jeg var en hjælp!
Avatar billede trer Nybegynder
09. februar 2004 - 15:57 #6
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 :-)
Avatar billede Kim Neesgaard Seniormester
11. februar 2004 - 12:54 #7
Undskyld jeg fortsætter spørgsmålet, men jeg synes det logisk skal ligge her - tillægspoint kan ordnes andetsteds!

Hvis nu T1 skal være en RIGHT JOIN af T2 (og RIGHT JOIN går godt i Oracle 8), hvordan vil SQL´en så se ud - min egen omskrivning fejler igen?
Avatar billede trer Nybegynder
11. februar 2004 - 13:18 #8
outer joins i gammel syntaks:

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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester