SQL 在嵌套查询中捕获 22 个? (执行顺序是什么?)

SQL catch 22 in nested queries ? (what is the order of execution ?)

假设我们有一个 table vv 和一个 table r
我们运行下面的查询来模拟一个集合的划分。

我理解这个查询 运行 就像一个嵌套的 for 循环
问题是:在最深的嵌套查询中,我们如何在构建尚未完成时使用 table vv1?

我认为 'select' 子句是最后一个要计算的子句,那么 mysql 在完成 where 子句之前如何知道 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

这是一个 correlated subquery. 对于主 vv1 table 中的每一行,它运行子查询,并将所有 vv.colName 值替换为来自主要 table。所以它不会尝试一次计算所有内部查询,它会为 vv1.

的每一行重复计算

另见 this tutorial 相关子查询,其中包含子查询位于 WHERE 子句中的示例。