题目:
有一个员工表dept_emp简况如下:
emp_no | dept_no | from_date | to_date |
10001 | d001 | 1986-06-26 | 9999-01-01 |
10002 | d001 | 1996-08-03 | 9999-01-01 |
10003 | d002 | 1995-12-03 | 9999-01-01 |
第一行表示为员工编号为10001的部门是d001部门。
有一个部门经理表dept_manager简况如下:
dept_no | emp_no | from_date | to_date |
d001 | 10002 | 1996-08-03 | 9999-01-01 |
d002 | 10003 | 1990-08-05 | 9999-01-01 |
第一行表示为d001部门的经理是编号为10002的员工。
获取所有的员工和员工对应的经理,如果员工本身是经理的话则不显示,以上例子如下:
emp_no | manager |
10001 | 10002 |
10002和10003本身都是经理
题解:
1.用not in先筛选出非经理,再join两表
select
tmp.emp_no,
m.emp_no
from
dept_manager m
join
(
select
emp_no,
dept_no
from
dept_emp
where
emp_no not in (
select
emp_no
from
dept_manager
)
and to_date = '9999-01-01'
)tmp
on
tmp.dept_no = m.dept_no
where
m.to_date = '9999-01-01'
2.先join两表,再join后的表中找出e.emp_no <> m.emp_no的行
select
e.emp_no,
m.emp_no
from
dept_emp e
join
dept_manager m
on
e.dept_no = m.dept_no
where
e.to_date = '9999-01-01'
and m.to_date = '9999-01-01'
and e.emp_no <> m.emp_no