将旧外连接转换为ANSI

0 sql oracle outer-join

我遇到了以下遗留的PL/SQL,并且发现对标量常量的外连接有些令人困惑.首先,有人可以确认我将此转换为ANSI的尝试是正确的.

遗产代码:

cursor c1item (c1item_iel_id number) is  
select  
  `<columns>`  
from  iel_item iit, iel_item_property iip  
  where iit.iit_change_type = 'I'  
  and   iip.iip_change_type (+) = 'I'  
  and   iip.it_id (+)  = iit.it_id  
  and   iit.iel_id = c1item_iel_id  
  and   iip.iel_id (+) = c1item_iel_id;
Run Code Online (Sandbox Code Playgroud)

ANSI代码

cursor c1item (c1item_iel_id number) is  
select  
   `<columns>`  
from  iel_item iit  
left outer join iel_item_property iip  
on  iip.it_id = iit.it_id  
    and  iit.iit_change_type = 'I'  
    and  iip.iip_change_type = 'I'  
    and  iit.iel_id = c1item_iel_id  
    and  iip.iel_id = c1item_iel_id;
Run Code Online (Sandbox Code Playgroud)

如果这是正确的,那么我没有看到使用外连接的意义.当然,如果表iit中的主键it_id在表iip中没有对应的外键,则iip.iit_change_typeiip.iel_id都将为NULL,在这种情况下,它们将被AND子句过滤掉.那么为什么不使用内连接呢?我错过了什么吗?或者是原始代码废话?

OMG*_*ies 6

不,它不正确 - 只有标有"(+)"的那些需要在LEFT JOIN中,其余的是WHERE子句:

   SELECT `<columns>`  
     FROM iel_item iit  
LEFT JOIN iel_item_property iip  ON iip.it_id = iit.it_id  
                                AND iip.iip_change_type = 'I'  
                                AND iip.iel_id = c1item_iel_id
    WHERE iit.iit_change_type = 'I'      
      AND iit.iel_id = c1item_iel_id  
Run Code Online (Sandbox Code Playgroud)

使用OUTER JOIN进行放置 - ON子句中的条件在JOIN之前应用,而WHERE中的条件在JOIN 之后应用.这可能会极大地影响返回的结果集,具体取决于数据和设置.对于INNER JOINS,放置无关紧要 - 在WHERE或ON子句中,结果集将是相同的.