如何通过Subquery实现两张表的关联查询并返回指定结果?
SQL查询方案:获取表2标记为TRUE的ID及其关联子ID
表结构
表1(父子关系表)
| ID | Parent ID |
|---|---|
| 00001256 | |
| 00001298 | 00001256 |
| 00087612 | |
| 00098542 | |
| 00009214 | 00087612 |
| 00087343 | 00098542 |
| 00456336 |
表2(标记表)
| ID | Flag |
|---|---|
| 00001256 | TRUE |
| 10000000 | |
| 00087612 | TRUE |
| 10000001 | |
| 10000002 | |
| 10000003 | |
| 00456336 | TRUE |
查询需求
提取表2中Flag = TRUE的所有ID,同时获取表1中Parent ID匹配这些ID的子ID,最终将两类ID合并为一个结果集(即使标记ID没有对应子ID也要保留)。
预期结果:
| Results |
|---|
| 00001256 |
| 00001298 |
| 00087612 |
| 00009214 |
| 00456336 |
现有代码片段
已写出筛选表2标记ID的子查询:
SELECT ID FROM table2 WHERE Flag = TRUE
解决方案
可以通过UNION ALL合并两类结果,将你的子查询作为过滤条件嵌套使用,以下是两种可行方案:
方案1:UNION ALL + 子查询
直接合并标记ID和对应子ID的结果:
-- 提取表2中Flag为TRUE的ID SELECT ID AS Results FROM table2 WHERE Flag = TRUE UNION ALL -- 提取表1中Parent ID属于上述标记ID的子ID SELECT t1.ID AS Results FROM table1 t1 WHERE t1.`Parent ID` IN ( SELECT ID FROM table2 WHERE Flag = TRUE ) ORDER BY Results;
方案2:CTE + JOIN优化(适合大数据量)
用公共表表达式(CTE)避免重复执行子查询,提升查询效率:
WITH flagged_ids AS ( SELECT ID FROM table2 WHERE Flag = TRUE ) -- 提取标记ID SELECT fi.ID AS Results FROM flagged_ids fi UNION ALL -- 提取关联的子ID SELECT t1.ID AS Results FROM table1 t1 JOIN flagged_ids fi ON t1.`Parent ID` = fi.ID ORDER BY Results;
说明
UNION ALL会保留所有结果(含重复值,若存在),如果需要去重可替换为UNION,但本次需求无重复场景,UNION ALL效率更高。ORDER BY Results用于匹配示例结果顺序,可根据实际需求调整或移除。
内容的提问来源于stack exchange,提问作者Nerdio
相关产品推荐
相关产品推荐

