如何避免使用Left Outer Join/Inner Join,改用子查询实现层级数据查询?
实现层级数据展开(无JOIN,仅用子查询)
当然可以!我们可以利用标量子查询来逐层获取每个节点的上级关联值,完全不需要使用JOIN语句。下面是具体的实现思路和代码:
原始表结构与数据
假设你的表名为hierarchy_table,原始数据如下:
value pvalue value_type an1001 bk1001 1 an1002 null 1 an1003 null 1 an1004 bk1002 1 bk1001 ck1001 2 bk1002 ck1002 2 ck1001 MG1001 3 ck1002 null 3
期望输出(修正列名笔误后)
value pvalue1 pvalue2 pvalue3 an1001 bk1001 ck1001 MG1001 an1002 null null null an1003 null null null an1004 bk1002 ck1002 null
(注:你给出的原始期望结果里列名存在重复,这里调整为pvalue1/pvalue2/pvalue3对应三级关联层级,逻辑更清晰)
纯子查询实现的SQL语句
我们针对每个层级的关联值,用嵌套的标量子查询直接从表中匹配:
SELECT value, -- 获取第一层级关联(对应value_type=2的节点) (SELECT pvalue FROM hierarchy_table ht2 WHERE ht2.value = ht1.pvalue AND ht2.value_type = 2) AS pvalue1, -- 获取第二层级关联(基于pvalue1的下一级节点) (SELECT pvalue FROM hierarchy_table ht3 WHERE ht3.value = (SELECT pvalue FROM hierarchy_table ht2 WHERE ht2.value = ht1.pvalue AND ht2.value_type = 2) AND ht3.value_type = 3) AS pvalue2, -- 获取第三层级关联(基于pvalue2的下一级节点) (SELECT pvalue FROM hierarchy_table ht4 WHERE ht4.value = (SELECT pvalue FROM hierarchy_table ht3 WHERE ht3.value = (SELECT pvalue FROM hierarchy_table ht2 WHERE ht2.value = ht1.pvalue AND ht2.value_type = 2) AND ht3.value_type = 3) AND ht4.value_type = 4) AS pvalue3 FROM hierarchy_table ht1 WHERE ht1.value_type = 1; -- 仅筛选最顶层的value_type=1的节点
逻辑说明
- 核心是嵌套标量子查询:每个层级的关联值都依赖上一级的查询结果,逐层向下匹配表中的记录。
- 标量子查询如果没有匹配到对应结果,会自动返回
null,正好符合你期望输出中空值的展示需求。 - 通过
WHERE ht1.value_type = 1精准过滤出最顶层节点,也就是你期望结果第一列的所有值。
这种写法完全没有使用任何JOIN语句,纯靠子查询就实现了层级数据的展开。
内容的提问来源于stack exchange,提问作者ashish
相关产品推荐
相关产品推荐

