请求详解MySQL WHERE IN多层嵌套子查询的执行过程
三层嵌套WHERE IN子查询SQL执行流程解析
这段SQL的核心是从ECOLI_DATA表中筛选出第三代大肠杆菌的ID(以无父节点的为第一代,依次递推),下面逐层拆解执行逻辑:
1. 最内层子查询(定位第一代节点)
SELECT ID FROM ECOLI_DATA WHERE PARENT_ID IS NULL
这一步直接筛选出所有没有父节点的大肠杆菌(即第一代),返回的是这类节点的ID集合。比如原表中PARENT_ID为NULL的记录ID是1,这里就返回结果集合 (1)。
2. 中间层子查询(定位第二代节点)
SELECT ID FROM ECOLI_DATA WHERE PARENT_ID IN (最内层子查询结果)
这一步把最内层得到的第一代ID作为父ID条件,筛选出所有父节点属于第一代的大肠杆菌(即第一代的直接子节点,也就是第二代),返回第二代节点的ID集合。比如最内层返回(1),这里就会找出所有PARENT_ID=1的记录,假设对应ID是2和3,返回结果集合 (2, 3)。
3. 外层子查询(定位第三代节点)
SELECT ID, PARENT_ID FROM ECOLI_DATA WHERE PARENT_ID IN (中间层子查询结果)
这一步用中间层得到的第二代ID作为父ID条件,筛选出所有父节点属于第二代的大肠杆菌(即第二代的直接子节点,也就是第三代),返回这些第三代节点的ID和对应的父ID。比如中间层返回(2,3),这里就会找出PARENT_ID=2或3的记录,假设对应ID是4、5、6,返回的临时表aa内容如下:
| ID | PARENT_ID |
|---|---|
| 4 | 2 |
| 5 | 2 |
| 6 | 3 |
4. 最终结果输出
SELECT ID FROM aa ORDER BY 1;
这一步从临时表aa中只取出ID列,并且按第一列(也就是ID列)升序排序,最终得到第三代大肠杆菌的ID列表:4, 5, 6。
内容的提问来源于stack exchange,提问作者DHK
相关产品推荐
相关产品推荐

