dan*_*car 13 mysql sql postgresql
我正在处理这样的查询:
SELECT * FROM requests where (id,langid) IN (SELECT nid,langid FROM node)
Run Code Online (Sandbox Code Playgroud)
我的问题是
我知道这不是最好的解决方案,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.
其他说明:
我使用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).这是文档链接.
您的查询可以在Postgres中使用.最好我知道,不是在MySQL.
支持它的DB的可移植版本是:
SELECT * FROM requests where ROW(id,langid) IN (SELECT nid,langid FROM node)
Run Code Online (Sandbox Code Playgroud)
(row自SQL:1999以来是一个保留的关键字.)
如exists()其他答案所示,将使用更便携的版本.
| 归档时间: |
|
| 查看次数: |
5670 次 |
| 最近记录: |