EMP DEPT SPECIAL_OPS, EMP.DEPTNO...
SQL> select e.ename
2 , e.job
3 , e.deptno
4 , coalesce(d.dname, s.dname) as dname
5 from emp e
6 left outer join dept d
7 on ( e.deptno = 30
8 and e.deptno = d.deptno )
9 left outer join special_ops s
10 on ( e.deptno != 30
11 and e.deptno = s.deptno )
12 where e.deptno in (30,50)
13 order by e.deptno, e.empno
14 /
ENAME JOB DEPTNO DNAME
---------- --------- ---------- --------------
VAN WIJK SALESMAN 30 SALES
PADFIELD SALESMAN 30 SALES
BILLINGTON SALESMAN 30 SALES
SPENCER MANAGER 30 SALES
CAVE SALESMAN 30 SALES
HALL CLERK 30 SALES
VERREYNNE PLUMBER 50 SKUNKWORKS
FEUERSTEIN PLUMBER 50 SKUNKWORKS
8 rows selected.
SQL>
I turned on the filter in EMP.DEPTNO in the ON clauses. This may not be necessary if the data in the tables are exclusive (i.e., DEPTNO = 30 can only join DEPT, and DEPTNO = 50 can only join SPECIAL_OPS). However, if an identifier can appear in both tables, it must also be explicit. In addition, making our intent clear is always good practice. Among other things, we cannot be sure of the future state of the data.
source
share