我的桌子有这种结构。我试图找到单词中没有出现的所有唯一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')
我也尝试了“不存在”,这不起作用
答案 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子句好很多倍。