"Where IN"是否在标准SQL中定义了多个列?

dan*_*car 13 mysql sql postgresql

我正在处理这样的查询:

SELECT * FROM requests where (id,langid) IN (SELECT nid,langid FROM node)
Run Code Online (Sandbox Code Playgroud)

我的问题是

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

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

  • gbn*_*gbn 12

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

    SELECT *
    FROM requests R
    WHERE 
        EXISTS (SELECT *
               FROM node n
               WHERE r.id = n.nid AND r.langid = n.langid
               )
    
    Run Code Online (Sandbox Code Playgroud)

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

    其他说明:

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


    Grz*_*ski 8

    我使用PostgreSQL检查了它并且它有效(它是官方支持的),但是你有责任使id↔nid和langid↔langid列类型兼容(或使用显式转换).

    我认为这是非常标准的构造.我有SQL:2003草案,并且在谓词中定义了(以及提到的存在谓词).

    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)
    
    Run Code Online (Sandbox Code Playgroud)

    编辑:

    检查在MySQL下也很好用(版本5.0.90-log).这是文档链接.


    Den*_*rdy 7

    您的查询可以在Postgres中使用.最好我知道,不是在MySQL.

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

    SELECT * FROM requests where ROW(id,langid) IN (SELECT nid,langid FROM node)
    
    Run Code Online (Sandbox Code Playgroud)

    (rowSQL:1999以来是一个保留的关键字.)

    exists()其他答案所示,将使用更便携的版本.