2010-03-22 3 views
5

외부 조인에서 두 개의 다른 테이블을 전환하려는 시나리오가 있습니다. -SQL의 LEFT OUTER JOIN에서 CASE 문 사용

  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) 

...하지만 작동하지 않습니다. 어떤 제안?

+2

그것은 다시 검사 데이터베이스 설계 가치가있을 수도 있습니다. table2와 table3이 같거나 유사한 스키마를 가지고 있다면 왜 다른 테이블입니까? –

+0

예제를 다시 검토해 볼 필요가 있습니다. 별칭/tablename 혼합이있는 것 같습니다. – jva

+0

그냥 BOTH 테이블에 가입하고 CASE 파트를 열리스트로 옮깁니다 – user38123

답변

4

사용 (오라클 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 
+0

mt.id가 2이지만 해당 ID에 대해 yt2에 일치하는 항목이 여러 개있는 행의 경우 중복이 발생할 수 있습니다. –

+0

@Gary : 게시 할 때 참으로 생각했지만 OP와 일치하는 쿼리를 게시하기로 결정했습니다. –

+0

감사. 이 작업은 훌륭하게 수행되었지만, 중복 된 값으로 간주되지 않습니다. 따라서이 작업도 처리됩니다. –

1

이 쿼리는 DEPT 테이블이나 EMP.DEPTNO의 값에 따라 SPECIAL_OPS 테이블 하나에 EMP 테이블에서 레코드를 조인 ...

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> 

ON 절에 EMP.DEPTNO에 필터를 포함 시켰습니다. 테이블의 데이터가 배타적 인 경우 (DEPTNO = 30은 DEPT에만 참여할 수 있고 DEPTNO = 50은 SPECIAL_OPS에만 참여할 수 있음)이 경우 필요하지 않을 수 있습니다. 그러나 식별자가 두 테이블 모두에 나타날 수있는 경우 명시 적이어야합니다. 게다가, 우리의 의도를 분명히하는 것은 항상 좋은 습관입니다. 우리는 그 밖의 것들과는 별도로 미래의 데이터 상태에 대해 확신 할 수 없습니다. 내가 오라클에 그것을 시도하지 않은 있지만

3

여기, 또 다른 가능성이다 :

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