多表内连接查询关键字不对应时要注意的一个问题

作者:iamlaosong

多表连接查询中最常用的事内连接,内连接中最常用的是等值连接,即在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。例如:

select *  from tb_evt_mail_clct a, tb_evt_dlv c

where a.clct_date between to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘) and

to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘)

and a.mail_num=c.mail_num;

上述查询中,A表(收寄表)和C表(投递表)中的邮件号码mail_num不一定是一一对应的,有可能A表中存在的,C表中不存在,按上面的语句查询,这些邮件将不会出现,如果需要出现,我们一般在等式的右边添加一个“(+)”,这样就可以列出A表中的所有内容,如下所示:

select *  from tb_evt_mail_clct a, tb_evt_dlv c

where a.clct_date between to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘) and

to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘)

and a.mail_num=c.mail_num(+);

如果我们要统计A表中存在C表中不存在的邮件量(未投递邮件量),可以用下面语句:

select count(*)  from tb_evt_mail_clct a, tb_evt_dlv c

where a.clct_date between to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘) and

to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘)

and a.mail_num=c.mail_num(+)

and c.mail_num is null;

我们可以用下面语句统计妥投邮件量,妥投的条件是c.dlv_sts_code = ‘I‘,即:

select count(*)  from tb_evt_mail_clct a, tb_evt_dlv c

where a.clct_date between to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘) and

to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘)

and a.mail_num=c.mail_num(+)

and c.dlv_sts_code = ‘I‘;

但是如果我们需要统计未妥投邮件量,下面语句是不成立的,统计的结果为0:

select count(*)  from tb_evt_mail_clct a, tb_evt_dlv c

where a.clct_date between to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘) and

to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘)

and a.mail_num=c.mail_num(+)

and c.dlv_sts_code = ‘I‘

and c.mail_num is null;

这是因为,c.mail_num is null这个条件成立时,c.dlv_sts_code 的值也是null,不可能等于‘I‘,所以,统计的结果为0,也就是说,当统计C表mail_num为空的量时,是不能用其它筛选条件的,确实需要统计的话,需要用下面语句:

select count(*)  from tb_evt_mail_clct a

where a.clct_date between to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘) and

to_date(‘2015-6-11‘, ‘yyyy-mm-dd‘)

and not exists (select 1

from tb_evt_dlv c

where c.mail_num = a.mail_num

and c.dlv_sts_code = ‘I‘)

时间: 2024-10-11 21:36:19

多表内连接查询关键字不对应时要注意的一个问题的相关文章

7-09内连接查询

多表连接查询:实际上是通过各个表之间共同列的关联行来查询数据的,它是关系数据库查询最主要的特征. 连接查询的分类: 内连接:根据表中共同的列进行匹配. 内连接的特点: 两个表存在主外键关系 参与查询两个表的地位相同无主次之分. 内连接查询就是两个表的数据放到一起相同的数据就是内连接查询. 内连接的实现方式: 1:使用WHERE语句指定连接条件. 2:在FROM语句中使用INNER JOIN..ON. 查询订单编号,还有商品编号: SELECT OrderInfo.OrderId,UserInfo

SQL 表的连接查询

连接:join 表名 on 关联条件 关键问题,哪些表?哪些关系? 内连接:inner join,两表中完全匹配的数据 select table_2.sname,Table_1.classname from Table_2 inner join Table_1 on Table_2.classid=Table_1.classID--查询2号表的信息对应1号表的相关信息select T2.sname,T1.classname from Table_2 as T2 inner join Table_

内连接查询

一.内连接查询 1.0表A *表B 2.重合的部分,就叫做内连接查询 二.内连接的特点 1.存在主外键关系 2.查询没有主次之分 三.内连接实现的方式 1.使用where字句指定连接条件 2.在from子句中使用inner  join...on --首先是两个表hanshu   .YingHu --设置主键关联连接 --查看编号,姓名,数量,商品名称SELECT hanshu.hanshuid as 编号,hanshu.id AS 数量,hanshu.name as 姓名,YingHu.YYna

表的连接查询

内连接(等值连接),外连接(左外连接,右外连接,全外连接) 内连接(等值连接): 左外连接(左连接) 右外连接(右连接) 同表自身连接: 全外连接:

SQL里3个表的连接查询

两种:1.select * from 表1,表2,表3 where 表1.字段=表2.字段 and 表1.字段=表3.字段这种效率比较低 结构简单数据量小可以采用2.select * from 表1 join 表2 on 表1.字段=表2.字段 and join 表3 on 表1.字段=表3.字段这个不错 提问者评价 第2个and join写错了,应该是join,没有and http://zhidao.baidu.com/link?url=jI4ahWhPIbnq6gXcOZHWAeUPwSmO

Oracle 连接查询<一>

在Oracle数据库中,连接查询分为交叉连接.内连接.外链接3种类型.其中,交叉连接结果是所有其他连接结果的超集,而外连接结果又是内连接结果的超集. 交叉连接 交叉连接又称为笛卡尔积连接,是两个或多个 表之间的无条件连接.一个表中所有记录分别与其他表中所有记录进行记录.如果进行连接的表分别有n1,n2,n3...条记录,那么交叉连接的结果集中将有n1 x n2 x n3 x...条记录.例如,emp表中有14条记录,dept表中有4条记录,那么两个交叉连接后有56条记录,语句为 SQL> SEL

07_MySQL DQL_多表查询_等值内连接

#6:连接查询/*含义:多表查询,当查询的字段来自多个表 笛卡尔积: 表1,m行:表2,n行: 表1,表2 = m*n行发生原因:表1的每行和表2的n行拼接,形成n行,最终得到m*n行如何避免:增加连接条件 连接查询的分类: 按年代分类: sql92标准[mysql只支持该标准的内连接,一部分外连接] sql99标准[推荐]mysql支持内连接 外连接(左右连接) 交叉连接 按功能分类: 内连接 等值连接 非等值连接 自连接 外连接 左连接 右连接 全连接 交叉连接*/USE girls; #

Mysql 表连接查询

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEF

多表连接查询

* 总结: * 1.为什么要拆表? * 去除冗余数据  (重复数据) * 2.添加外键解决了什么问题?关键字  constraint 约束        foreign  key  外键        references相关联 * 解决了插入数据的完整性(正确性和准确性) * 例:   constraint croe_sid foreign key(sid) references student(id) *  * 第二种: alter table core add constraint cro