T-SQL:在临时表中使用xxx IN

25

我有一个临时表,想在where子句中检查特定的id/string是否包含在临时表中。

Select...
WHERE MyId  IN MyTempTable

我在MS SQL Management Studio中遇到了一般性错误。

"In"运算符是否不适用于临时表?

3个回答

34
您的语法有误:
SELECT ...
  FROM MyTable
 WHERE MyID IN (SELECT MyID
                  FROM MyTempTable)

我不太喜欢使用IN运算符,所以我更喜欢这种方式:

SELECT ...
  FROM MyTable
 WHERE EXISTS (SELECT *
                 FROM MyTempTable
                WHERE MyTable.MyID = MyID)

但这主要是个人口味问题。


+1,你说得对,通常使用 NOT IN 比 NOT EXISTS 更好,因为它们有很大的不同。那么为什么不一致地使用 EXISTS 呢?INTERSECT 也可以使用。请参见我的答案 - gbn
1
@gbn:正如我所说,这在很大程度上是个人口味问题,但我的理由更多地基于我对关系模型的理解,而不仅仅是一致性。首先,“IN”是语言中有点不必要的瑕疵;任何可以使用“(NOT) IN”表达的内容都有一个等价的“(NOT) EXISTS”。但同时,它也是一个语义上的奇怪之处,既不来自关系代数也不来自关系演算。它被SQL的设计者们为了我无法理解的原因而加入其中。然而,它肯定是一个大问题,因为它显然是SQL(“结构化查询语言”)中S的原因。 - Marcelo Cantos
NOT IN 不等于 NOT EXISTS,这就是我的评论。在 NOT IN 列表中的 NULL 将不会产生任何结果。为什么要有 "IN"?我猜当 ANSI 聚集在一起时,他们从当时的某个 SQL 方言中采用了 IN。 - gbn
@gbn:你说得没错,但我像避开瘟疫一样避免使用null(像NOT IN ('a','b','c',NULL)这样的暴行只是许多动机之一),所以我通常不会在我的思考中考虑这种情况。此外,我并不是指ANSI SQL,而是指产生这些方言的原始设计工作。 - Marcelo Cantos
@Lisa:显而易见的方法。如果你无法想出来,请发布另一个问题,并附上你尝试过的任何代码。 - Marcelo Cantos

5

您的语法略有错误。您需要这样做:

SELECT ...
  FROM ...
 WHERE MyId IN (SELECT MyId 
                  FROM MyTempTable);

0

in需要一个特定项目的列表。 表通常具有多个字段,如何知道您要使用哪个字段?

您可以使用子查询,where field in (select whatever from #temp)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接