이 쿼리는 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에만 참여할 수 있음)이 경우 필요하지 않을 수 있습니다. 그러나 식별자가 두 테이블 모두에 나타날 수있는 경우 명시 적이어야합니다. 게다가, 우리의 의도를 분명히하는 것은 항상 좋은 습관입니다. 우리는 그 밖의 것들과는 별도로 미래의 데이터 상태에 대해 확신 할 수 없습니다. 내가 오라클에 그것을 시도하지 않은 있지만
출처
2010-03-22 13:50:32
APC
그것은 다시 검사 데이터베이스 설계 가치가있을 수도 있습니다. table2와 table3이 같거나 유사한 스키마를 가지고 있다면 왜 다른 테이블입니까? –
예제를 다시 검토해 볼 필요가 있습니다. 별칭/tablename 혼합이있는 것 같습니다. – jva
그냥 BOTH 테이블에 가입하고 CASE 파트를 열리스트로 옮깁니다 – user38123