在SSMS中替代NOT IN

时间:2019-03-13 16:14:09

标签: sql sql-server tsql

我的桌子有这种结构。我试图找到单词中没有出现的所有唯一ID。如何在MS SQL Server中实现这一目标。

id word
1  hello
2  friends
2  world
3  cat
3  dog
2  country
1  phone
4  eyes

我有一个单词列表

**List**

phone 
eyes
hair
body

预期输出

除了列表中的单词,我需要所有唯一的ID。在这种情况下,是

2
3


I&4不在输出中,因为它们的单词出现在列表

我尝试了以下代码

Select count(distinct ID)
from Table1
where word not in ('phone','eyes','hair','body')

我也尝试了“不存在”,这不起作用

5 个答案:

答案 0 :(得分:8)

您也可以使用GROUP BY

SELECT id
FROM Table1
GROUP BY id 
HAVING MAX(CASE WHEN word IN('phone', 'eyes', 'hair', 'body') THEN 1 ELSE 0 END) = 0

答案 1 :(得分:5)

一种方法是使用not exists,其中内部查询通过id链接到外部查询,并由搜索词过滤。

首先,创建并填充示例表(在您将来的问题中为我们保存此步骤):

DECLARE @T AS TABLE (
    id int, 
    word varchar(20)
)
INSERT INTO @T VALUES
(1, 'hello'),
(2, 'friends'),
(2, 'world'),
(3, 'cat'),
(3, 'dog'),
(2, 'country'),
(1, 'phone'),
(4, 'eyes')

查询:

SELECT DISTINCT id
FROM @T t0
WHERE NOT EXISTS
(
    SELECT 1
    FROM @T t1
    WHERE word IN('phone', 'eyes', 'hair', 'body')
    AND t0.Id = t1.Id
)

结果:

id
2
3

答案 2 :(得分:4)

SELECT t.id FROM dbo.table AS t
  WHERE NOT EXISTS (SELECT 1 FROM dbo.table AS t2
    INNER JOIN 
      (VALUES('phone'),('eyes'),('hair'),('body')) AS lw(word)
    ON t2.word = lw.word
    AND t2.id = t.id)
GROUP BY t.id;

答案 3 :(得分:1)

您也可以尝试:这是一个动态表结构:

NSFileHandleReadToEndOfFileCompletionNotification

答案 4 :(得分:0)

关于SQL的好处是有时候有很多方法可以做事情。一种方法是将您的已知值列表放入#temp表中,然后运行类似的操作。

Select * from dbo.maintable

EXCEPT

Select * from #tempExcludeValues

结果将为您提供未在预定义列表中的所有记录。第二种方法是进行联接,就像Larnu在上面的评论中提到的那样。通常,NOT IN不是在大型数据集上执行操作的最快方法。到目前为止,JOIN是最有效的数据过滤方法。比使用IN或NOT IN子句好很多倍。