添加更多连接条件后,从完全外连接返回的记录数会增加

时间:2014-06-10 22:11:12

标签: sql-server-2008-r2 full-outer-join

我在外面加入两张桌子。表1(LEAD)有689,189行,表2(CONTACT)有133,318行,它们的完整外连接返回738,959行。到目前为止,这是有道理的。

每个表都有一个字段,指示记录是否被逻辑删除,其值为Y。我只想在两个表中返回值不等于Y的行。当我向查询添加其他条件时

select COUNT(*)
from LEAD l
full join CONTACT c on l.CONVERTEDCONTACTID = c.ID and l.DELETE_FLAG <> 'Y' and c.DELETE_FLAG <> 'Y'

我得到的行数比没有它们要多。他们不应该使查询更具限制性吗?我知道我可以使用子查询来执行连接,但我只是不明白我是如何得出这个结果的。

2 个答案:

答案 0 :(得分:0)

简短回答:改为将新标准放在where子句中。

select COUNT(*)
from LEAD l
full join CONTACT c on l.CONVERTEDCONTACTID = c.ID
where l.DELETE_FLAG <> 'Y' and c.DELETE_FLAG <> 'Y'

额外的连接条件是从连接另一侧的表中添加更多带空值的记录,从而产生额外的结果。

我不是100%确定如何处理只影响一方的条件的完全连接; l.DELETE_FLAG <> 'Y'c.DELETE_FLAG <> 'Y'每个只查看联接中的两个表中的一个,我有理由确定这是原因。

答案 1 :(得分:0)

只需在WHERE子句中添加其他条件,如下所示:

select COUNT(*)
    from LEAD l
    full join CONTACT c on l.CONVERTEDCONTACTID = c.ID 
    where  l.DELETE_FLAG <> 'Y' and c.DELETE_FLAG <> 'Y'

如果您的表包含NULL值,请按以下方式进行调整:

select COUNT(*) 
     from LEAD l 
     full join CONTACT c on l.CONVERTEDCONTACTID = c.ID 
     where  (l.DELETE_FLAG <> 'Y' or l.DELETE_FLAG is NULL) and 
     (c.DELETE_FLAG <> 'Y' or c.DELETE_FLAG is NULL)