(按dept_type查询)_SQL
--emp表
CREATE TABLE `emp` (
`empNo` varchar(10) DEFAULT NULL,
`empName` varchar(10) DEFAULT NULL,
`deptNo` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--插入数据:
e01 eName01 d01
e02 eName02 d02
e03 eName03 d03
e04 eName04 d04
e05 eName05 d05
e06 eName06 d06
--dept表
CREATE TABLE `dept` (
`dept_type` varchar(10) DEFAULT NULL,
`deptno` varchar(10) DEFAULT NULL,
`deptNo01` varchar(10) DEFAULT NULL,
`deptName01` varchar(10) DEFAULT NULL,--插入数据时忽略
`deptNo02` varchar(10) DEFAULT NULL,--插入数据时忽略
`deptName02` varchar(10) DEFAULT NULL,--插入数据时忽略
`deptNo03` varchar(10) DEFAULT NULL,--插入数据时忽略
`deptName03` varchar(10) DEFAULT NULL,--插入数据时忽略
`deptNo04` varchar(10) DEFAULT NULL,--插入数据时忽略
`deptName04` varchar(10) DEFAULT NULL--插入数据时忽略
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--插入数据:
99 d02 dt红02
01 d01 dt红01
03 d03 dt黑03
99 d04 dt红04
01 d05 dt红05
03 d06 dt黑06
--首次执行发现用一部门属于多个不同dept_type时,只能显示一条
--如:deptNo=02 属于不同dept_type 却只显示一条,不是想要的结果
--
SELECT
e.`deptNo`,
IFNULL(d1.dept_type,d2.dept_type) dept_type,
IFNULL(d1.deptNo01,d2.deptNo01) deptNo01
FROM emp e
LEFT JOIN
(
SELECT * FROM dept d
WHERE d.dept_type =03
) d1
ON e.deptNo = d1.deptno
LEFT JOIN
(
SELECT * FROM dept d
WHERE d.dept_type =01 OR d.dept_type =99
) d2
ON e.deptNo = d2.deptno
result:
d01 01 dt红01
d02 03 dt黑02
d03 03 dt黑03
d04 99 dt红04
d05 01 dt红05
d06 03 dt黑06
--针对如上问题做出调整
--筛分属于不同dept_type的数据 使用 union 联合 , 得到想要的结果
SELECT
e.`deptNo`,
d1.dept_type,
d1.deptNo01
FROM emp e
INNER JOIN
(
SELECT * FROM dept d
WHERE d.dept_type =03
) d1
ON e.deptNo = d1.deptno
UNION
SELECT
e.`deptNo`,
d2.dept_type,
d2.deptNo01
FROM emp e
INNER JOIN
(
SELECT * FROM dept d
WHERE d.dept_type =01 OR d.dept_type =99
) d2
ON e.deptNo = d2.deptno
result:
d01 01 dt红01
d02 03 dt黑02
d02 99 dt红02
d03 03 dt黑03
d04 99 dt红04
d05 01 dt红05
d06 03 dt黑06