如何将带WHERE条件的Oracle(+)语法改写为标准LEFT JOIN语句
Oracle (+)外连接语法转标准LEFT JOIN的正确方案
你改写报错的核心原因是遗漏了表b的关联声明,原SQL中a和b为内连接关系,需要在FROM子句中明确声明关联。
正确改写后的SQL
FROM a INNER JOIN b ON a.c = b.c LEFT JOIN c ON a.d = c.d WHERE b.a = '101' AND a.a = '202' AND ROWNUM = 1;
语法对应说明
- 原SQL中不带
(+)的等值条件b.c = a.c是a和b的内连接规则,必须通过INNER JOIN显式引入表b,否则WHERE子句引用b的字段就会触发表不存在的报错 - 原SQL中
a.d = c.d(+)是左外连接规则,即保留a表的所有匹配行,c表没有匹配的字段自动补空,对应标准SQL的a LEFT JOIN c ON a.d = c.d - 两个表的固定过滤条件
b.a = '101'、a.a = '202'和取第一行的限制ROWNUM = 1保持放在WHERE子句即可,逻辑和原SQL完全一致。
内容的提问来源于stack exchange,提问作者klabbaparn
相关产品推荐
相关产品推荐

