Oracle 12c非ANSI连接语法实现复杂左连接(物化视图场景)
正确的旧Oracle风格连接语句
要实现与你的ANSI左连接完全一致的效果(返回所有员工,仅Corporate部门员工关联对应Overhead值,Retail部门员工该字段为NULL),旧Oracle语法需要将连接条件与外连接关联,同时确保非Corporate部门的员工不会被过滤。正确语句如下:
select EMP.EmpID, EMP.Department, OVERHEAD.Overhead as CorpOverhead from EMP, OVERHEAD where OVERHEAD.EmpID (+) = EMP.EmpID and (EMP.Department = 'Corporate' or OVERHEAD.EmpID is null)
为什么SQL Developer的转换结果不符合需求?
Oracle SQL Developer的自动转换工具通常会错误地将EMP.Department = 'Corporate'直接移至WHERE子句且未补充OVERHEAD.EmpID is null的条件,生成类似下面的错误语句:
select EMP.EmpID, EMP.Department, OVERHEAD.Overhead as CorpOverhead from EMP, OVERHEAD where OVERHEAD.EmpID (+) = EMP.EmpID and EMP.Department = 'Corporate'
这种写法会直接过滤掉所有非Corporate部门的员工,相当于将左外连接变成了内连接,完全不符合你保留所有员工的需求。
内容的提问来源于stack exchange,提问作者Monolithguy
相关产品推荐
相关产品推荐

