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 临时表的主要内容,如果未能解决你的问题,请参考以下文章