【问题标题】:Is “Where IN” with multiple columns defined in Standard SQL?标准 SQL 中是否定义了多列的“Where IN”?
【发布时间】:2011-06-09 19:26:14
【问题描述】:

我正在处理这样的查询:

SELECT * FROM requests where (id,langid) IN (SELECT nid,langid FROM node)

我的问题是

  • 这在 mysql 和 postgresql 中有效吗?
  • 这是标准 SQL 支持的吗?

    我知道这不是最好的解决方案,JOIN 会起作用,但我对此不感兴趣。

  • 【问题讨论】:

    • 在 Microsoft SQL Server 中不起作用。
    • 你试过mysql和postgres吗?
    • 是的。我今天遇到了完全相同的问题,我真的试过了,它奏效了:)

    标签: mysql sql postgresql


    【解决方案1】:

    标准和可移植的 SQL 将是 EXISTS.. 并且在语义上是相同的 IN

    SELECT *
    FROM requests R
    WHERE 
        EXISTS (SELECT *
               FROM node n
               WHERE r.id = n.nid AND r.langid = n.langid
               )
    

    多列 IN 至少不能移植到 SQL Server 或 Sybase。

    其他说明:

    • JOIN 可能需要 DISTINCT,并且与 IN 或 EXISTS 不同。
    • 最后一个选项是 INTERSECT,它不太受支持,工作方式类似于 IN/EXISTS
    • IIRC 一些史前 MySQL 版本 (3.x?) 不支持 EXISTS 的相关性

    【讨论】:

      【解决方案2】:

      我使用 PostgreSQL 进行了检查,它可以工作(它是 officially supported),但您有责任使 id ↔ nid 和 langid ↔ langid 列类型兼容(或使用显式转换)。

      我认为这是非常标准的构造。我有 SQL:2003 draft 并且定义了 in predicate(以及提到的 exists predicate)。

      8.4

      功能

      指定一个量化的比较。

      格式

      <in predicate> ::= <row value predicand> <in predicate part 2>
      <in predicate part 2> ::= [ NOT ] IN <in predicate value>
      <in predicate value> ::=
      <table subquery>
      | ... (rest is not important here)
      

      编辑:

      检查后在 MySQL 下也可以正常工作(版本 5.0.90-log)。 Here is 文档链接。

      【讨论】:

        【解决方案3】:

        您的查询可以在 Postgres 中运行。据我所知,不是在 MySQL 中。

        支持它的 DB 的可移植版本是:

        SELECT * FROM requests where ROW(id,langid) IN (SELECT nid,langid FROM node)
        

        (row 是保留关键字,因为SQL:1999。)

        更便携的版本将是使用exists(),如另一个答案中所建议的那样。

        【讨论】:

          【解决方案4】:

          您的 SQL 代码在 SQL-92 标准方面是有效的。您可以使用Mimer SQL-92 online validator 自己确认这一点(SQL-99 和SQL:2003 也可用)。但是,因为它是完整 SQL-92 的一个特性,所以它的实现并没有应有的那么广泛。

          从关系上讲,有问题的运算符是semi-join,没有任何 SQL 标准(也没有供应商的扩展?)有明确的语法。

          【讨论】:

            猜你喜欢
            • 2012-03-14
            • 1970-01-01
            • 2018-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多