Oracle (+)外连接符改写为LEFT JOIN的语法问题咨询
Oracle 特有(+)外连接语法转标准LEFT JOIN指南
核心转换规则
(+)符号标记的字段所属的表为外连接的右表,关联时作为LEFT JOIN的匹配侧- 无
(+)的多表等值关联属于INNER JOIN逻辑 - 单表过滤条件可以放在对应表的JOIN ON子句中,也可以放在全局WHERE子句,建议放ON子句避免外连接后过滤出现语义偏差
第一个SQL转换示例
原SQL
SELECT x.a, y.a, z.a FROM x, y, z WHERE x.k = y.k(+) AND x.p = z.p(+);
转换后标准LEFT JOIN写法
SELECT x.a, y.a, z.a FROM x LEFT JOIN y ON x.k = y.k LEFT JOIN z ON x.p = z.p;
转换逻辑说明
原语句主表为x,y和z的关联字段都带(+),因此分别对y、z做左连接即可,逻辑完全等价。
第二个SQL转换示例
原SQL片段
FROM a,b,c WHERE b.a = '101' AND a.a = '202' AND b.c = a.c AND a.d = c.d(+) AND ROWNUM = 1;
转换后标准JOIN写法
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;
转换逻辑说明
- a和b是等值关联无
(+),属于INNER JOIN,关联条件为a.c = b.c - c的关联字段带
(+),作为左连接的右表,关联条件为a.d = c.d - 单表过滤条件
b.a = '101'、a.a = '202'和全局行限制条件ROWNUM = 1保留在WHERE子句中即可。
内容的提问来源于stack exchange,提问作者klabbaparn
相关产品推荐
相关产品推荐

