Левое внешнее соединение на нескольких таблицах в Oracle

Как написать запрос оракула, который эквивалентен нижеследующему запросу в 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"

Я пробовал как:

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"

Может ли кто-нибудь помочь мне получить правильный синтаксис.

Ответ 1

Напишите одну таблицу для каждого соединения, например:

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"

Обратите внимание, что хотя мой запрос содержит фактическое левое соединение, ваш запрос, по-видимому, этого не делает. Поскольку условия находятся в месте, ваш запрос должен вести себя как внутренние соединения. (Хотя я признаю, что не знаю Informix, возможно, я ошибаюсь).

Если это действительно так, вы можете изменить левое соединение на внутреннее соединение. Вы должны использовать внутреннее соединение, где это возможно, поскольку они быстрее, чем левое соединение.

PS: левое и левое внешние соединения одинаковы.

Ответ 2

Я предполагаю, что вы хотите что-то вроде

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)