web-dev-qa-db-fra.com

Jointure externe gauche sur plusieurs tables dans Oracle

Comment écrire une requête Oracle équivalente à la requête ci-dessous dans Informix:

select tab1.a,tab2.b,tab3.c,tab4.d 
  from table1 tab1,
       table2 tab2 OUTER (table3 tab3,table4 tab4,table5 tab5) 
 where tab3.xya = tab4.xya 
   AND tab4.ss = tab1.ss 
   AND tab3.dd = tab5.dd 
   AND tab1.fg = tab2.fg 
   AND tab4.kk = tab5.kk 
   AND tab3.desc = "XYZ"

J'ai essayé comme:

select tab1.a,tab2.b,tab3.c,tab4.d 
  from table1 tab1,
       table2 tab2 LEFT OUTER JOIN (table3 tab3,table4 tab4,table5 tab5) 
 where tab3.xya = tab4.xya 
   AND tab4.ss = tab1.ss 
   AND tab3.dd = tab5.dd 
   AND tab1.fg = tab2.fg 
   AND tab4.kk = tab5.kk 
   AND tab3.desc = "XYZ"

Quelqu'un peut-il m'aider à obtenir la syntaxe correcte?.

11
divya chekuri

Écrivez une table par jointure, comme ceci:

select tab1.a,tab2.b,tab3.c,tab4.d 
from 
  table1 tab1
  inner join table2 tab2 on tab2.fg = tab1.fg
  left join table3 tab3 on tab3.xxx = tab1.xxx
  left join table4 tab4 on tab4.xya = tab3.xya and tab4.ss = tab3.ss
  left join table5 tab5 on tab5.dd = tab3.dd and tab5.kk = tab4.kk
where
  tab3.desc = "XYZ"

Notez que bien que ma requête contienne une jointure gauche réelle, votre requête ne le fait apparemment pas. Étant donné que les conditions se trouvent dans le où, votre requête doit se comporter comme des jointures internes. (Bien que j'avoue que je ne connais pas Informix, alors je me trompe peut-être).

Si tel est le cas, vous pouvez remplacer la jointure gauche par la jointure interne. Vous devez utiliser la jointure interne dans la mesure du possible, car ils sont plus rapides que la jointure gauche.

PS: la jointure gauche et la jointure externe gauche sont identiques.

29
GolezTrol

Je suppose que tu veux quelque chose comme

SELECT tab1.a, tab2.b, tab3.c, tab4.d
  FROM table1 tab1 
       JOIN table2 tab2 ON (tab1.fg = tab2.fg)
       LEFT OUTER JOIN table4 tab4 ON (tab1.ss = tab4.ss)
       LEFT OUTER JOIN table3 tab3 ON (tab4.xya = tab3.xya and tab3.desc = 'XYZ')
       LEFT OUTER JOIN table5 tab5 on (tab4.kk = tab5.kk AND
                                       tab3.dd = tab5.dd)
11
Justin Cave