Questa interrogazione unisce i record dalla tabella EMP sia al tavolo DEPT o la tabella SPECIAL_OPS, a seconda del valore di 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>
Ho incluso il filtro su EMP.DEPTNO nelle clausole ON. Questo potrebbe non essere necessario se i dati nelle tabelle sono esclusivi (ad esempio, DEPTNO = 30 poteva solo unirsi a DEPT e DEPTNO = 50 poteva solo unirsi a SPECIAL_OPS). Tuttavia, se l'identificatore può apparire in entrambe le tabelle, è altrettanto esplicito. Inoltre, rendere chiaro il nostro intento è sempre una buona pratica. A parte tutto, non possiamo essere sicuri del futuro stato dei dati.
Potrebbe valere la pena di riesaminare la struttura del database. Se sia table2 che table3 hanno schemi uguali o simili, perché sono tabelle diverse? –
Vale anche la pena riesaminare il tuo esempio. Sembra esserci un mix di alias/tablename. – jva
Basta unirsi alle tabelle BOTH e spostare la parte CASE nell'elenco delle colonne – user38123