Sql 将传统外部联接转换为ANSI

Sql 将传统外部联接转换为ANSI,sql,oracle,outer-join,Sql,Oracle,Outer Join,我遇到了以下遗留PL/SQL,并发现针对标量常量的外部联接有些混乱。首先,请有人确认我将其转换为ANSI的尝试是正确的 遗留代码: ANSI代码 如果这是正确的,那么我不认为使用外部联接有什么意义。当然,如果表iit中的主键it_id在表iip中没有对应的外键,那么iip.iit_change_type和iip.iel_id都将为NULL,在这种情况下,它们将被and子句过滤掉。那么为什么不使用内部联接呢?我错过什么了吗?或者原始代码是胡说八道吗?不,它不正确-只有标有+的代码需要在左连接中,其

我遇到了以下遗留PL/SQL,并发现针对标量常量的外部联接有些混乱。首先,请有人确认我将其转换为ANSI的尝试是正确的

遗留代码:

ANSI代码


如果这是正确的,那么我不认为使用外部联接有什么意义。当然,如果表iit中的主键it_id在表iip中没有对应的外键,那么iip.iit_change_type和iip.iel_id都将为NULL,在这种情况下,它们将被and子句过滤掉。那么为什么不使用内部联接呢?我错过什么了吗?或者原始代码是胡说八道吗?

不,它不正确-只有标有+的代码需要在左连接中,其余的代码用于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  

放置与外部联接有关-ON子句中的条件在联接之前应用,而WHERE中的条件在联接之后应用。这会极大地影响返回的结果集,具体取决于数据和设置。对于内部联接,放置并不重要-在WHERE或ON子句中,结果集将是相同的。

不,这是不正确的。原始查询中只有3个外部连接谓词,新查询中有5个外部连接谓词

应该是:

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  iip.iip_change_type = 'I'  
    and  iip.iel_id = c1item_iel_id
where    and  iit.iel_id = c1item_iel_id  
    and  iit.iit_change_type = 'I' ; 

它也可以这样重写:

SELECT columns1
FROM   iel_item iit
       RIGHT OUTER JOIN iel_item_property iip
         ON iip.iip_change_type = 'I'
            AND iip.it_id = iit.it_id
            AND iip.iel_id = c1item_iel_id
WHERE  iit.iit_change_type = 'I'   
        AND iit.iel_id = c1item_iel_id

下一次,如果您需要将Oracle专有连接重写为符合ANSI SQL的连接,这可以帮助您自动完成,而不易出错。

所以我遗漏了一些东西。Thanks@cyberwiki当前位置我很清楚是你对我的答案投了反对票,而对竞争对手的答案投了反对票。答案是否100%正确并不重要,也不重要。不管你得到什么样的反对票,你都可以责怪我,这并不意味着我投了他们,尽管你说了很多废话。忘掉你自己,已经长大了。这有关系吗?每一个dv都是你分数的0.003%。你是在把旧版改成ANSI,还是只是想知道ANSI会是什么样子?只是想理解旧版代码。转换成ANSI似乎有帮助。但是你不会把代码改成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  iip.iip_change_type = 'I'  
    and  iip.iel_id = c1item_iel_id
where    and  iit.iel_id = c1item_iel_id  
    and  iit.iit_change_type = 'I' ; 
SELECT columns1
FROM   iel_item iit
       RIGHT OUTER JOIN iel_item_property iip
         ON iip.iip_change_type = 'I'
            AND iip.it_id = iit.it_id
            AND iip.iel_id = c1item_iel_id
WHERE  iit.iit_change_type = 'I'   
        AND iit.iel_id = c1item_iel_id