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

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

Select...
WHERE MyId  IN MyTempTable

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

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

【问题讨论】:

    标签: sql-server where in-operator temp-tables


    【解决方案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:显而易见的方式。如果您无法弄清楚,请使用您尝试过的任何代码发布另一个问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多