分组外联接的使用

  今天在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进行连接后,再合并结果得到所需结果。实验证明也确实如此,顺利得到所需结果。

  

分组外联接的使用,布布扣,bubuko.com

时间: 2024-10-10 08:55:05

分组外联接的使用的相关文章

数据库编程1 Oracle 过滤 函数 分组 外连接 自连接

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> 数据库编程1 Oracle 过滤 函数 分组 外连接 自连接 本文实验基于的数据表: winsows安装好Oracle11g之后,开始实验 SQLplus 登陆 ORacle sqlplus 退出的方式 查看用户之下有什么表 查看表的所有记录,不区分大小写 设置SQLplus行宽,页宽,列宽: 清屏命令 select as 语法 1,as别名的使用 2,没有引号带有空格的别名,无法识别: 3,带有

数据库编程2 Oracle 过滤 函数 分组 外连接 自连接

[本文谢绝转载原文来自http://990487026.blog.51cto.com] 续:数据库编程1 Oracle 过滤 函数 分组 外连接 自连接 where like模糊查询,查询员工姓名是4个字母 SQL> select * from emp where ename like '____';      EMPNO ENAME                JOB                       MGR HIREDATE          SAL       COMM    

【数据库系列学习二】外联接

表t1: 表t2: 自然联接: 全外联接: 左外联接: 右外联接:

SQL联接 外联接 内联接 完全联接 交叉联接

联接分为: 内联接????????????????????????[inner join] 外联接????????(左外联接,右外联接)????????[left join/left outer join, right join/right outer join] 完全联接????????????????????[full join] 交叉联接????????????????????[cross join] a表???? id????ebcid????name????????b表 ????uid

SQL SERVER中 外联接即(left join)on 和 where 的区别

使用内联接,无论在JOIN 子句还是 WHERE 子句中,条件具有相同的结果,但使用外联接时并非如此. 当条件在JOIN子句时,SQL SERVER包括外表的所有行,然后使用条件包括第二个表中的行. 当限制置于WHERE子句时,先执行联接,然后将where子句应用于联接行. 上述表述不是很明白 ,以下的解释更清楚. 即:ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行. 如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有

联接——外联接

与内联接和交叉联接不同,外联接是在ANSI SQL-92 中才被引入的,因此它只有一种标准语法--在表名之间指定JOIN关键字,在ON子句中指定联接条件.外联接会应用内联接所应用的两个逻辑处理步骤(笛卡尔积和ON过滤),此外还多加一个外联接特有的第三步:添加外部行. 在外联接中,要把一个表标记为"保留的"表,可以在表名之羊使用关键字LEFT OUTER JOIN.RIGHT OUTER JOIN.以及FULL OUTER JOIN,其中 OUTER 关键字是可选的.LEFT关键字表示左

hive内联接和外联接

hql很多语句和sql有相似之处,下面用例子快速了解内外联接的用法 在多表操作的时候,经常会遇到需要的数据,一部分存在a表,一部分存在b表,或者存在更多的表中. 而我们可以从这些表的关系进行联接,下面创建两个表进行实例演示: 首先创建一个学生信息表,有id,s_name,c_name三个属性 hive> create table stu_msg( > id string, > s_name string, > c_name string) > row format delim

SQL学习之高级联结(自联结、自然联结、外联接)

create table Customers( Id int identity(1000000,1), Company varchar(30) null, Name varchar(20) null ) insert into Customers values('Fun4All','Tom') insert into Customers values('Alibaba','Tim') insert into Customers values('BaiDu','Jerry') insert int

SQL语句汇总(终篇)—— 表联接与联接查询

既然是最后一篇那就不能只列出些干枯的标准语句,更何况表联接也是SQL中较难的部分,所以此次搭配题目来详细阐述表联接. 上一篇博文说到相关子查询效率低下,那我们怎么能将不同表的信息一起查询出来呢?这就需要用到表联接. 和之前的UNION组合查询不同,UNION是将不同的表组合起来,也就是纵向联接,说白了就是竖着拼起来. 而表联接是通过笛卡尔乘积将表进行横向联接,所谓的通过笛卡尔乘积简单说就是两表的行依次相联再相加.要想更详细的理解可以百度下,毕竟本文主要是汇总SQL语句. 现在有如下两张表: 这是