Sql SSMS中不存在的替代方案

Sql SSMS中不存在的替代方案,sql,sql-server,tsql,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不在输出中,因为它们的文字出现在列表中 我尝试了以下

我的桌子就在这个结构里。我正在尝试查找其单词未出现在列表中的所有唯一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')

我尝试了Not Exists(不存在)也不起作用

一种方法是使用
Not Exists(不存在)
,其中内部查询通过id链接到外部查询,并通过搜索词进行过滤

首先,创建并填充样本表(请在以后的问题中保存此步骤):

查询:

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

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

Select * from dbo.maintable

EXCEPT

Select * from #tempExcludeValues

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

您也可以使用
分组方式

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;
SELECT id
FROM Table1
GROUP BY id 
HAVING MAX(CASE WHEN word IN('phone', 'eyes', 'hair', 'body') THEN 1 ELSE 0 END) = 0

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

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')

DECLARE @tblNotUsed AS TABLE ( id int, word varchar(20))
DECLARE @tblNotUsedIds AS TABLE (id int)

INSERT INTO @tblNotUsed VALUES
(1, 'phone'),
(2, 'eyes'),
(3, 'hair'),
(4, 'body')

INSERT INTO @tblNotUsedIds (id) 
SELECT [@T].id FROM @T INNER JOIN @tblNotUsed ON [@tblNotUsed].word = [@T].word

SELECT DISTINCT id FROM @T 
WHERE id NOT IN (SELECT id FROM @tblNotUsedIds)

不存在
左连接
然后
其中{LEFT JOIN TABLE}.{COLUMN}为空
?到目前为止,你尝试了什么,为什么没有成功?为什么不
不在
中(除了fr4om,它在
NULL
值方面有问题)?为什么有重复的id?@DanielA.White,这就是我的数据。我从来都不明白为什么要对非唯一列使用名称
id
。@terry-现在不要更改它。这将意味着你得到的所有答案都需要调整,比我的答案更好:-)@ZoharPeled也许,但你有“拯救我们这一步”@ZoharPeled-更短,实践中是否更好可能取决于OP的数据和可用性indexes@JohnCappelletti我发现大多数时候,得到这样答案的人实际上为我们在未来的问题中节省了这一步(特别是如果他们最终接受了这个答案),所以我想这是我对问题质量的一点贡献…@MartinSmith好吧,至少从维护的角度来看,这更好-但是是的,性能方面,这取决于您列出的因素。
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')

DECLARE @tblNotUsed AS TABLE ( id int, word varchar(20))
DECLARE @tblNotUsedIds AS TABLE (id int)

INSERT INTO @tblNotUsed VALUES
(1, 'phone'),
(2, 'eyes'),
(3, 'hair'),
(4, 'body')

INSERT INTO @tblNotUsedIds (id) 
SELECT [@T].id FROM @T INNER JOIN @tblNotUsed ON [@tblNotUsed].word = [@T].word

SELECT DISTINCT id FROM @T 
WHERE id NOT IN (SELECT id FROM @tblNotUsedIds)