采用where子句的倒数来提取差异

时间:2012-08-14 15:26:44

标签: sql sql-server-2008

我的原始查询返回7975行。添加where子句,我收到7917行。我想SELECT 58行差异。为了做到这一点,我写了我认为是反向where子句。不幸的是,我只看到41行,而不是预期的58行。

TableName.Column和TableName.Column2都可以为空。

原来的地方

where ((TableName.Column in ('1', '2', '3))
or (TableName.Column2 in ('1', '2', '3))

我尝试反向

where ((TableName.Column not in ('1', '2', '3))
and (TableName.Column2 not in ('1', '2', '3))

4 个答案:

答案 0 :(得分:2)

SELECT 
    * 
FROM 
    TableName 
EXCEPT 
SELECT 
    * 
FROM 
    TableName 
WHERE 
    ((TableName.Column IN ('1', '2', '3))
    OR (TableName.Column2 IN ('1', '2', '3))

顺便说一下,我怀疑NULL值会导致你的结果丢失。空值不是IN,它们也不是NOT IN特定集合。

答案 1 :(得分:1)

你的问题是NULL。真正的反转是:

where (coalesce(TableName.Column, '') not in ('1', '2', '3))

或:

where tableName is NULL or (TableName.Column not in ('1', '2', '3))

对于这两列,这将是:

where (coalesce(TableName.Column, '') not in ('1', '2', '3)) and
      (coalesce(TableName.Column2, '') not in ('1', '2', '3)

答案 2 :(得分:1)

如上所述,SQL的3向逻辑强制要求null在所有测试中失败,除了对无效的显式测试。

如果x为空,则测试x = 3将失败,文本x != 3也会失败。此外,测试x = null失败(这不是对无效的明确测试)。成功或失败的唯一测试"正确" for nulls是测试x is [not] null

SQL Server的问题是它的默认行为WRT null不会那样工作。

但是,如果编写SQL查询以正确检查null / non-null,则无论数据库行为如何,查询都将正常工作。

答案 3 :(得分:0)

你的两个人都缺少')。我想这是一个错字。

所以你的原始查询是:

where ((X) or (Y))

然后你改为

where ((!X) and (!Y))

这不是一回事。在第一个示例中,只有一个条件需要为true才能评估查询,因此将返回Column上1的行。在第二个,两者都需要为真,所以它只返回第1列和第2列没有1,2或3的行

你究竟需要返回什么?