嵌套查询中的SQL catch 22? (执行的顺序是什么?)

时间:2015-09-17 05:47:15

标签: mysql relational-division

假设我们有一个表格vv和一个表格r
我们运行以下查询来模拟集合划分。

我理解这个查询的运行方式类似于嵌套的for循环
问题是:在最深层的嵌套查询中,如果表vv1的构造尚未完成,我们如何使用表vv1?

我认为'选择'子句是最后一个要计算的子句,那么在完成where子句之前,mysql如何知道vv1具有不同的值(或者它具有的值),但是为了完成where子句,它必须首先完成它?

SELECT DISTINCT vv1.y
FROM   vv AS vv1
WHERE  NOT EXISTS (SELECT r.A
                   FROM   r
                   WHERE  r.A NOT IN (SELECT vv2.x
                                      FROM   vv AS vv2
                                      WHERE  vv2.y = vv1.y)); 


+------+ Table r
| A    |
+------+
|    1 |
|    2 |
|    3 |
+------+

+------+------+ Table vv
| x    | y    |
+------+------+
|    1 | A    |
|    2 | A    |
|    3 | A    |
|    1 | B    |
|    2 | B    |
|    3 | C    |
|    3 | D    |
+------+------+

在此处试试:SQLFIDDLE

1 个答案:

答案 0 :(得分:3)

这是correlated subquery.对于主vv1表中的每一行,它运行子查询,其中所有vv.colName值都替换为主表中的相应条目。因此,它不会尝试同时计算内部查询,而是为vv1的每一行重复计算。

另请参阅相关子查询的this tutorial,它包含子查询位于WHERE子句中的示例。