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
子句中的示例。
假设我们有一个 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
子句中的示例。