T-SQL: where xxx IN 临时表

Posted

技术标签:

【中文标题】T-SQL: where xxx IN 临时表【英文标题】:T-SQL: Where xxx IN temporary table 【发布时间】:2011-05-21 01:22:33 【问题描述】:

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

Select...
WHERE MyId  IN MyTempTable

我在 MS SQL 管理工作室中遇到一般错误。

“In”运算符是否不适合临时表?

【问题讨论】:

【参考方案1】:

in 需要特定项目的列表。表格一般有多个字段,怎么知道你指的是哪个字段?

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

【讨论】:

【参考方案2】:

你的语法有点错误。你需要做的:

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

【讨论】:

【参考方案3】:

你的语法错误:

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 也可以。请看我的answer here @gbn:正如我所说,这在很大程度上是一个品味问题,但我的理由更多是基于我对关系模型的理解,而不仅仅是一致性。首先,IN 在语言中是个小毛病,完全没有必要。任何可以用(NOT) IN 表达的东西都有一个等价的(NOT) EXISTS。而且,它是一种语义上的怪异,既不来自关系代数,也不来自关系演算。由于我无法理解的原因,SQL 的设计人员将它放在了那里。不过,这一定是一件大事,因为这显然是 SQL 中的 S(“结构化”)的原因。 NOT IN 不等于 NOT EXISTS 因此我的评论。 NOT IN 列表中的 NULL 不会给出任何结果。为什么“IN”在那里?我猜当 ANSI 组合在一起时,他们从当时的一种 SQL 方言中获取了 IN @gbn:你是对的,但我避免像瘟疫那样的空值(像NOT IN ('a', 'b', 'c', NULL) 这样的暴行只是众多动机之一),所以我通常不会在我的想法中考虑这种情况。另外,我指的不是 ANSI SQL,而是产生这些方言的原始设计工作。 @Lisa:显而易见的方式。如果您无法弄清楚,请使用您尝试过的任何代码发布另一个问题。

以上是关于T-SQL: where xxx IN 临时表的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL 动态 SQL 和临时表

T-SQL 之 表变量和临时表

带有随机NEWID列T-SQL的临时表

T-SQL 之 公用表表达式(CTE)

T-SQL 公用表表达式(CTE)

临时表 (XXX) 已存在于会话中