У меня есть сценарий, где я хочу включить две различных таблицы во внешнем объединении. Это проходит примерно так:-
select mytable.id,
yourtable.id
from mytable
left outer join (case
when mytable.id = 2 then table2
yourtable on table1.id = table2.id
else
table3 yourtable on table1.id = table3.id
end)
... но это не работает. Какие-либо предложения?
Используйте (Oracle 9i +):
SELECT mt.id,
COALESCE(yt1.id, yt2.id)
FROM MYTABLE mt
LEFT JOIN YOURTABLE yt1 ON yt1.id = mt.id
AND yt.id = 2
LEFT JOIN YOURTABLE yt2 ON yt2.id = mt.id
Вот еще одна возможность, хотя я не пробовал ее на Oracle:
select mytable.id,
yourtable.id
from table1 as mytable left outer join
(SELECT 2 AS tableid, *
FROM table2
UNION ALL
SELECT 1, *
FROM table3) as yourtable
ON mytable.id = yourtable.id
AND tableid = CASE WHEN mytable.id = 2 THEN 2 ELSE 1 END
Этот запрос объединяет записи из таблицы 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>
Я включил фильтр EMP.DEPTNO в предложения ON. Это может быть ненужным, если данные в таблицах являются эксклюзивными (т.е. DEPTNO = 30 может присоединяться только к DEPT, а DEPTNO = 50 может присоединяться только к SPECIAL_OPS). Однако, если идентификатор может присутствовать в обеих таблицах, он также должен быть явным. Кроме того, всегда полезно четко выражать свои намерения. Кроме всего прочего, мы не можем быть уверены в будущем состоянии данных.