假设我们有一个表格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
答案 0 :(得分:3)
这是correlated subquery.对于主vv1
表中的每一行,它运行子查询,其中所有vv.colName
值都替换为主表中的相应条目。因此,它不会尝试同时计算内部查询,而是为vv1
的每一行重复计算。
另请参阅相关子查询的this tutorial,它包含子查询位于WHERE
子句中的示例。