Cette requête rejoint les enregistrements de la table EMP soit la table DEPT ou la table SPECIAL_OPS, en fonction de la valeur de 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>
J'ai inclus le filtre sur EMP.DEPTNO dans les clauses ON. Cela peut être inutile si les données dans les tables sont exclusives (c'est-à-dire que DEPTNO = 30 ne peut se joindre qu'à DEPT et DEPTNO = 50 ne peut que se joindre à SPECIAL_OPS). Cependant, si l'identifiant peut apparaître dans les deux tables, il est également nécessaire d'être explicite. En outre, rendre notre intention claire est toujours une bonne pratique. En dehors de toute autre chose, nous ne pouvons pas être sûrs de l'état futur des données.
Il pourrait être utile de réexaminer la conception de votre base de données. Si à la fois table2 et table3 ont des schémas identiques ou similaires, pourquoi sont-ils des tables différentes? –
Il vaut également la peine de réexaminer votre exemple. Il semble y avoir alias/nom de table mélangé. – jva
Il suffit de joindre aux deux tables et de déplacer la partie CASE vers la liste des colonnes – user38123