分享

找出两张表中不匹配的记录

 俺永不后悔 2012-05-29

找出两张表中不匹配的记录

前面说了找出两张表中匹配的记录,这里接着讲找出两张表中不匹配的记录。还是以前面的A表B表为例。从A表中找出B表没有的记录,与从B表中找出A表没有的记录,结果是不一样。

我下面的记载,是使用SQL时不同的尝试,有些得出正确答案,有些没有,但可以分析一下为什么是这样一个答案。以找出"A表中B没有匹配项的记录"为例:

1、是Access的"Find Unmatched Query Wizard"生成的。
SELECT A.*  FROM A LEFT JOIN B ON A.ID = B.ID  WHERE (B.ID Is Null);

注意在Access中,返回的查询下部有新增记录空白行。
找出B表中A没有匹配项的记录,把上面语句中A、B对调。

2、SELECT A.* FROM A LEFT JOIN B ON A.ID = B.ID WHERE (A.ID Not In (B.ID));

这样写跟上面是一个意思,LEFT JOIN后,B.ID一部分是Null,一部分跟A.ID一样。A.ID Not In (B.ID)排除了跟B一样的ID,就是B.ID为Null的部分。注意在Access中,返回的查询下部有新增记录空白行。

3、SELECT A.* FROM A  WHERE ((A.ID) Not In (select B.ID from B));

这里用到了子查询,表达很简洁。注意在Access中,返回的查询下部有新增记录空白行。

4、SELECT A.*  FROM A, B  WHERE ((A.ID) Not In (B.ID));
这样写结果是不对的,返回的记录数量相当大。经过分析,返回的记录内容和记录数量都是可以预测的。这个表达中,A和B没有建立关系。它们的比较方式如下:A表中所有记录跟B表中第一条记录比较,不一样的就返回(即使会跟B表中后面的记录一样);接下来,A表中所有记录跟B表中第二条记录比较,不一样的就返回(即使跟B表中第一条记录匹配);以此类推,直到B表最后一条记录。
可以按如下思路推导公式:总的比较次数为 A总记录数×B总记录数。跟据如上比较方法,A表在跟B表中相同记录比较时,每次会扣掉相同的一项,总的扣掉数就是相同记录数。
因此公式为:A总记录数×B总记录数-相同记录数

注意在Access中,返回的查询下部没有新增记录空白行。

5、SELECT A.* FROM A,B  WHERE ((A.ID) Not In (select B.ID from B));
注意跟3的不同,FROM后面多了个B表,返回的不同记录内容是对的,但是重复了很多遍,重复遍数是B表的记录数。5中表达方法做了3中表达方法做的事,但是有个B表在那里,指针就要在B表从头到尾移动一遍,From后面的B是画蛇添足。
注意在Access中,返回的查询下部没有新增记录空白行。

4和5不同在哪里呢,B.ID是一个数,(select B.ID from B)是一组数。在4中,A表记录跟一个数逐一比较后出结果,在5中,跟一组数比较后出结果,返回的不同值当然是不一样的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多