问题
有部门表和部门管理员表,部门表比较常规,反常的是部门管理员表。这张表是ETL整理出来的表,包含各部门的主管、秘书、机要员信息等等。
下面把关键字段列出来:
部门表,department:
dept_code | dept_name |
---|---|
50040001 | 部门1 |
50040002 | 部门2 |
50040003 | 部门3 |
部门管理员表,manager:
dept_code | emp_code | type_id | seq_id |
---|---|---|---|
50040002 | 03328 | 1 | 1 |
50040002 | 06667 | 1 | 2 |
50040002 | 11053 | 2 | 1 |
50040003 | 15075 | 1 | 1 |
type_id表示这个人的角色,type_id=1则为部门主管,type_id=2则为部门秘书,还有其它的可能不列举了。
seq_id表示顺序,因为有的部门会有多个主管和多个秘书,需要给他们一个顺序。同时,有的部门什么都没有,如部门1,在manager表里根本没有记录。
我们的目标是,关联出每个部门的主管信息,没有的话(确实有没有主管的部门)为空,多个的话取第1个。输出类似下面的结构:
dept_code | dept_name | emp_code |
---|---|---|
50040001 | 部门1 | null |
50040002 | 部门2 | 01381 |
50040003 | 部门3 | 15075 |
我能写的SQL如下,简直是裹脚布啊,不知道怎么优化:
SELECT
d.dept_code,
d.dept_name,
m.emp_code
FROM
department as d
LEFT JOIN (
SELECT
type_id,
dept_code,
emp_code
FROM
hrs.manager
WHERE
type_id = 1
AND seq_id = 1) AS m ON
d.dept_code = m.dept_code