如何合并两个查询以获取父节点的子节点及孙节点结果?
合并查询获取子节点与孙节点的Test数据
我来帮你搞定这个合并查询的问题!先明确你的核心需求:从course类型的父节点(对应object_data里obj_id=3217的记录)出发,同时获取它的直接子节点中的test(tst类型),以及孙节点中的test,并把这两部分结果合并成一个统一数据集。
先把你的表结构清晰列出来方便参考:
表结构
object_data表
| obj_id | type | title |
|---|---|---|
| 3217 | crs | it |
| 3221 | grp | xyz |
| 3228 | tst | test |
| 3264 | tst | test3 |
object_reference表
| ref_id | obj_id |
|---|---|
| 337 | 3217 |
| 338 | 3221 |
| 343 | 3228 |
| 371 | 3264 |
tree表
| tree | child | parent |
|---|---|---|
| 1 | 338 | 337 |
| 2 | 343 | 338 |
注:这里我补全了第二条记录的parent为338,也就是grp类型节点对应的ref_id,这样逻辑上343就是孙节点的ref_id,如果实际数据不同,你只需要替换成对应值即可
合并查询方案
你可以用UNION ALL(保留所有结果,包括重复项)或者UNION(自动去重)来合并两个查询的结果,分别获取子节点和孙节点的test数据。
完整SQL代码
-- 获取直接子节点中的test数据 SELECT od.obj_id, od.type, od.title FROM object_data od JOIN object_reference ore ON od.obj_id = ore.obj_id JOIN tree t ON ore.ref_id = t.child WHERE t.parent = (SELECT ref_id FROM object_reference WHERE obj_id = 3217) -- 定位course节点的ref_id AND od.type = 'tst' UNION ALL -- 获取孙节点中的test数据 SELECT od.obj_id, od.type, od.title FROM object_data od JOIN object_reference ore ON od.obj_id = ore.obj_id JOIN tree t1 ON ore.ref_id = t1.child JOIN tree t2 ON t1.parent = t2.child WHERE t2.parent = (SELECT ref_id FROM object_reference WHERE obj_id = 3217) -- 定位course节点的ref_id AND od.type = 'tst';
代码解释
子节点查询部分:
- 先通过子查询找到
course节点(obj_id=3217)对应的ref_id(也就是337) - 关联
tree表找到所有父节点是337的子节点ref_id - 最后关联
object_reference和object_data,筛选出类型为tst的记录
- 先通过子查询找到
孙节点查询部分:
- 多关联了一层
tree表(t2),先找到course的子节点ref_id,再找到这些子节点的子节点(孙节点)的ref_id - 同样关联到
object_reference和object_data筛选tst类型记录
- 多关联了一层
UNION ALL vs UNION:如果你的树形结构中不存在同一个
test节点既是子节点又是孙节点的情况,用UNION ALL效率更高;如果担心有重复数据,可以换成UNION,它会自动去重。
内容的提问来源于stack exchange,提问作者ixia sai
相关产品推荐
相关产品推荐

