为什么这种语法在MySQL中有效(匹配列对的列对)?

Vil*_*lx- 4 mysql syntax

刚才我需要做类似以下查询的事情,并且惊讶于它实际上是有意图的.但是我找不到任何关于它的文件,所以我有点担心这个未知的副作用.这是我写的:

select * from Table1 where (col1, col2) in (select col3, col4 from Table2)
Run Code Online (Sandbox Code Playgroud)

这似乎是将一对列与列对列表进行匹配.这是它应该如何工作,还是我可以期待一些令人讨厌的惊喜?

Pas*_*TIN 7

MySQL手册中似乎有一个关于该语法的页面:12.2.9.5.行子查询

其中一个例子就是这个(引用):

SELECT column1,column2,column3
       FROM t1
       WHERE (column1,column2,column3) IN
             (SELECT column1,column2,column3 FROM t2);
Run Code Online (Sandbox Code Playgroud)

这与您的查询非常相似.

所以我认为它是官方支持的.


同一页说(引用):

行构造函数在其他上下文中也是合法的.例如,以下两个语句在语义上是等效的(尽管第一个语句在MySQL 5.0.26之前无法优化):

SELECT * FROM t1 WHERE (column1,column2) = (1,1);
SELECT * FROM t1 WHERE column1 = 1 AND column2 = 1;
Run Code Online (Sandbox Code Playgroud)

所以,即使你提出的语法是有效的,第二个可能会更好,如果你可以使用它,至少-更容易阅读/理解;-)
,你会发现关于从子查询很多其他的东西第12.2.9.子查询语法


(是的,不容易找到^^)