emp_dept_SQL

(按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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值