Использование операторов CASE в LEFT OUTER JOIN в SQL - PullRequest
5 голосов
/ 22 марта 2010

У меня есть сценарий, в котором я хочу включить две разные таблицы во внешнем соединении. Это выглядит примерно так: -

         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)

... но это не работает. Есть предложения?

Ответы [ 3 ]

4 голосов
/ 22 марта 2010

Использование (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
3 голосов
/ 22 марта 2010

Вот еще одна возможность, хотя я не пробовал ее в 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
1 голос
/ 22 марта 2010

Этот запрос объединяет записи из таблицы 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). Однако, если идентификатор может появиться в обеих таблицах, это также должно быть явным. Кроме того, разъяснение наших намерений всегда является хорошей практикой. Помимо всего прочего, мы не можем быть уверены в будущем состоянии данных.

...