SQL玩出花--多个SQL查询合并为一个

之前有讲过使用decode来做表查询的合并。表连接部分相同但是连接条件不同的时候,既可以使用union all将多个查询拼接起来,也可以在一个查询中使用decode选择性地连接相应的记录。没有实例属实有点抽象。还是有请Oracle老演员emp表出厂,见下方。

e6c7630729db4b7584d2dfe2fd924f34.png

假如我有需求:

字段1:码值为ABC

字段2:A对应的是部门10,job为PRESIDENT员工姓名。B对应部门20,job为MANAGER的员工姓名,C对应部门30,job为‘CLERK’的员工姓名

算法1:

简单的表拼接

select 'A',(select ename from emp where  job='PRESIDENT' and deptno=10) from dual
union
select 'B',(select ename  from emp where job='MANAGER' and deptno=20) from dual
union
select 'C',(select ename  from emp  where job='CLERK' and deptno=30) from dual

f814219c14eb4a21b585f568ca0a6061.png

算法2:

表部分相同,但是条件不同,可以考虑表连接里面做判断

select T1.c,T2.ename from
(select 'A' c from dual
union
select 'B' c from dual
union
select 'C' c from dual)T1
join emp T2 on deptno=decode(T1.c,'A',10,'B',20,'C',30) and  job=decode(T1.c,'A','PRESIDENT','B','MANAGER','C','CLERK')

43dc265462a4449c9c385c7e9223a7a2.png

验证:

select 'A',(select ename from emp where  job='PRESIDENT' and deptno=10) from dual
union
select 'B',(select ename  from emp where job='MANAGER' and deptno=20) from dual
union
select 'C',(select ename  from emp  where job='CLERK' and deptno=30) from dual

minus

select T1.c,T2.ename from
(select 'A' c from dual
union
select 'B' c from dual
union
select 'C' c from dual)T1
join emp T2 on deptno=decode(T1.c,'A',10,'B',20,'C',30) and  job=decode(T1.c,'A','PRESIDENT','B','MANAGER','C','CLERK')

结果为空集。

2d937e1b2bf04e3bb0821be9da3dabd1.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值