programing

Informix에서 Oracle로 여러 테이블을 포함하는 왼쪽 외부 조인 다시 쓰기

lastcode 2023. 9. 9. 09:33
반응형

Informix에서 Oracle로 여러 테이블을 포함하는 왼쪽 외부 조인 다시 쓰기

다음 Informix 쿼리와 동일한 Oracle 쿼리를 작성하려면 어떻게 해야 합니까?

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"

정확한 구문은 무엇입니까?

다음과 같이 조인당 하나의 테이블을 작성합니다.

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 and tab3.desc = "XYZ"
  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

제 쿼리에는 실제 왼쪽 조인이 포함되어 있지만 쿼리에는 포함되어 있지 않습니다.조건이 거기에 있기 때문에 쿼리는 내부 조인처럼 행동해야 합니다. (Informix를 모른다는 것은 인정하지만, 틀렸을 수도 있습니다.)

질문에 사용된 특정 Informix 확장자는 왼쪽 조인과 관련하여 약간 다르게 작동합니다.조인 자체의 정확한 구문과는 별개로, Informix에서는 외부 조인 테이블 목록을 지정할 수 있습니다.이들은 외부 결합된 상태로 남게 되며, 결합 조건은 where 절에 넣을 수 있습니다.SQL에 대한 특정 확장입니다.Informix는 'normal' left join도 지원하지만, 하나의 쿼리로 둘을 결합할 수는 없는 것 같습니다.

Oracle에서는 이 확장자가 존재하지 않으며 where 절에 외부 조인 조건을 넣을 수 없습니다. 조건은 상관없이 실행되기 때문입니다.

조건을 where 절로 이동하면 어떻게 되는지 살펴봅니다.

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
  left join table5 tab5 on tab5.dd = tab3.dd and tab5.kk = tab4.kk
where
  tab3.desc = "XYZ" and
  tab4.ss = tab3.ss

이제 두 조건이 맞는 행만 반환됩니다.행을 찾을 수 없는 경우에는 참일 수 없습니다. 따라서 표 3 및/또는 표 4에 일치하는 행이 없는 경우 또는ss둘 중 하나에서 null이고, 이 조건 중 하나가 false를 반환하며, 행이 반환되지 않습니다.이렇게 하면 외부 조인이 내부 조인으로 효과적으로 변경되어 동작이 크게 변경됩니다.

PS:left join그리고.left outer join같습니다.즉, 선택적으로 두 번째 테이블을 첫 번째 테이블(왼쪽 테이블)에 결합합니다.조인의 '왼쪽' 부분에 데이터만 있는 경우 행이 반환됩니다.Oracle에서는 다음과 같은 작업을 수행할 수 있습니다.right [outer] join왼쪽이 아니라 오른쪽 테이블을 선두 테이블로 만드는 것입니다.그리고 심지어는full [outer] join표에 데이터가 있는 경우 행을 반환합니다.

내 생각엔 당신이 원하는 것은

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)

언급URL : https://stackoverflow.com/questions/7182059/rewrite-left-outer-join-involving-multiple-tables-from-informix-to-oracle

반응형