日期:2014-05-17  浏览次数:20698 次

一个奇怪的外连接问题
现在有A表(主表),结构和数据如下:

serial_no xm

00000000000194013768                       时**
00000000000194005220                       孟**


B表(从表),结构和数据如下:

serial_no a_serial_no   rq

12010100050000000143         00000000000194005220
12010100050000000161         00000000000194005220           20070411
12010100050000000145         00000000000194013768           20070410

用以下SQL文检索:

select     a.xm,
                b.rq,
                b.serial_no
  from   a,b
  where   a.serial_no   =   b.a_serial_no(+)  
  and   b.rq(+)   is   null   ;

  结果如下:

rownum xm rq serial_no

  1 孟**                                                       12010100050000000143
  2 时**

  可是我预想的结果却是:
rownum xm rq serial_no

  1 孟**                                                       12010100050000000143
  2 时**
  3               孟**

  请问为什么我预想中的rownum:3没有出来?
  如果条件不符合的话,那为什么rownum:2却能出来,
  他们应该是一样的呀?
  为什么rownum:1出来后,我预想的rownum:3就被过滤掉了?


------解决方案--------------------
select a.xm,
b.rq,
b.serial_no
from a,b
where a.serial_no = b.a_serial_no(+)
and b.rq(+) is null ;
等价于:
select a.xm, b.rq, b.serial_no
from a left join b on a.serial_no = b.a_serial_no and b.rq is null
也就是说a表左连接b表,看b表是否存在a.serial_no = b.a_serial_no and b.rq is null的纪录,如果存在,则显示相关的b表中的信息;否则,对a表中的纪录在b表中找不到纪录相匹配的话,则在查询出的结果集的对应字段中显示null,所以仅仅返回两条纪录,而不是楼主希望的3条纪录