【发布时间】:2011-05-21 01:22:33
【问题描述】:
我有一个临时表,想在 where 子句中检查某个 id/string 是否包含在临时表中。
Select...
WHERE MyId IN MyTempTable
我在 MS SQL 管理工作室中遇到一般错误。
“In”运算符是否不适合临时表?
【问题讨论】:
标签: sql-server where in-operator temp-tables
我有一个临时表,想在 where 子句中检查某个 id/string 是否包含在临时表中。
Select...
WHERE MyId IN MyTempTable
我在 MS SQL 管理工作室中遇到一般错误。
“In”运算符是否不适合临时表?
【问题讨论】:
标签: sql-server where in-operator temp-tables
in 需要特定项目的列表。表格一般有多个字段,怎么知道你指的是哪个字段?
您可以使用子查询,where field in (select whatever from #temp)
【讨论】:
你的语法有点错误。你需要做的:
SELECT ...
FROM ...
WHERE MyId IN (SELECT MyId
FROM MyTempTable);
【讨论】:
你的语法错误:
SELECT ...
FROM MyTable
WHERE MyID IN (SELECT MyID
FROM MyTempTable)
我不太喜欢 IN 运算符,所以我更喜欢这个:
SELECT ...
FROM MyTable
WHERE EXISTS (SELECT *
FROM MyTempTable
WHERE MyTable.MyID = MyID)
但这在很大程度上是一个品味问题。
【讨论】:
IN 在语言中是个小毛病,完全没有必要。任何可以用(NOT) IN 表达的东西都有一个等价的(NOT) EXISTS。而且,它是一种语义上的怪异,既不来自关系代数,也不来自关系演算。由于我无法理解的原因,SQL 的设计人员将它放在了那里。不过,这一定是一件大事,因为这显然是 SQL 中的 S(“结构化”)的原因。
NOT IN ('a', 'b', 'c', NULL) 这样的暴行只是众多动机之一),所以我通常不会在我的想法中考虑这种情况。另外,我指的不是 ANSI SQL,而是产生这些方言的原始设计工作。