0

我已经完全加入了两张桌子。表 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'

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

4

2 回答 2

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)
于 2014-06-12T06:04:17.617 回答
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'每个人都只查看连接中的两个表之一,我有理由确定这是原因。

于 2014-06-10T22:57:06.037 回答