我遇到了以下遗留的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_type和iip.iel_id都将为NULL,在这种情况下,它们将被AND子句过滤掉.那么为什么不使用内连接呢?我错过了什么吗?或者是原始代码废话?
不,它不正确 - 只有标有"(+)"的那些需要在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子句中,结果集将是相同的.
| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |