Использование операторов выбора в ЛЕВОМ ВНЕШНЕМ ОБЪЕДИНЕНИИ в SQL

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

         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)

... но это не работает. Какие-либо предложения?

5
задан OMG Ponies 25 March 2010 в 04:11
поделиться

3 ответа

Используйте (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
4
ответ дан 14 December 2019 в 04:35
поделиться

Вот еще одна возможность, хотя я не пробовал ее на 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
3
ответ дан 14 December 2019 в 04:35
поделиться

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

1
ответ дан 14 December 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: