分组外联接的使用

  今天在itpub上卡到一个帖子,大致要解决的问题如下:假设有一个公司的考勤记录,数据如下:

    张三,20140619;

    张三,20140620;

    张三,20140621;

    李四,20140619;

    李四,20140621;

    王五,20140619;

    王五,20140620;

假设有需求,需查询出某位员工在某段时间内未考勤的日期,如何写这个sql语句呢?

  模拟出实验数据:

drop table t02;
create table t02 (names varchar2(20),rq varchar2(20));

select * from t02;

insert into t02(names,rq) 
select 'A','1' from dual
union all 
select 'A','2' from dual
union all 
select 'A','3' from dual
union all 
select 'B','1' from dual
union all 
select 'B','3' from dual
union all 
select 'C','1' from dual
union all 
select 'C','2' from dual

从上面数据可以看到,缺失的数据为names=‘B’ rq=‘2’和names=‘C’ rq=‘3’的数据;

开始我的思路是构造一个日期维度表(范围介于并包括需求的最大和最小日期),然后用t02右外连接这张表,rq is null的结果即为我所需,但事实却不是这样。

例如:

with t03 as
(select level rq
  from dual 
connect by level <=3
)
select * from t02 right join t03 on t02.rq=t03.rq where t02.rq is null;

因为每个员工都存在多个考勤信息,缺失的考勤日期会不一样,所以整表右外连接查询不到预想的t02.rq为空的记录,自然就找不到我们的需求数据。后来在坛子里看到一种方法,即分组外连接,也可以叫分区外连接,具体语法如下:

with t03 as
(select level rq
  from dual 
connect by level <=3
)
select * from t02
partition by (t02.names)
right join t03 
on t02.rq=t03.rq
where t02.rq is null;

使用此语法可以实现将t02表先分组与t03进行连接后,再合并结果得到所需结果。实验证明也确实如此,顺利得到所需结果。

  

 

转载于:https://www.cnblogs.com/assassinann/p/partition_outer_join.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值