表格1
no name col1 1 a a_1 2 b b_1
表2
id name parent a_1 zz c_1 b_1 yy d_1 c_1 aa null d_1 bb e_1 e_1 dd1 null
我要显示的是显示所有列表名称。例如,表1名称a具有col1名称a_1,它将在表2上显示名称,然后在表2中检查父项并显示它,并继续检查直到发现null。例子如下。我很抱歉给我不好的解释
t1_name t2_name t2_name t2_name a zz aa b yy bb dd1
或如下所示
t1_name t2_name a aa/zz
b dd1/bb/yy
我所做的就是这个查询
select t1.name,t2.name as folder from table1 as t1 inner join table2 as t2 on t1.col1=t2.id
而且我不知道如何在查询中再次检查...我version 12.2.0.1.0在SQL开发人员中使用oracle 有帮助吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
要实现您所描述的功能,即递归查询并展示表1中每一项的关联链直到找到null
为止,可以使用Oracle中的递归SQL查询。在您的版本(12.2.0.1.0)中,可以利用递归公用表表达式(Recursive Common Table Expression, CTE)来完成这个任务。
下面是一个示例SQL查询,展示了如何构建这样的递归查询:
WITH RECURSIVE chain AS (
-- 基础查询:从表1开始,连接到表2获取直接关联的名称
SELECT t1.name AS t1_name, t2.name AS t2_name, t2.parent
FROM table1 t1
JOIN table2 t2 ON t1.col1 = t2.id
UNION ALL
-- 递归部分:基于上一步的结果,继续查找父级,直到parent为null
SELECT c.t1_name, t2.name, t2.parent
FROM chain c
JOIN table2 t2 ON c.t2_name = t2.id
WHERE t2.parent IS NOT NULL
)
-- 最终查询:选择t1_name和所有关联的t2_name,使用LISTAGG函数聚合t2_name成字符串
SELECT t1_name,
LISTAGG(t2_name, '/') WITHIN GROUP (ORDER BY level DESC) AS full_path
FROM (
SELECT t1_name, t2_name, LEVEL
FROM chain
)
GROUP BY t1_name
ORDER BY t1_name;
这段SQL首先定义了一个名为chain
的递归CTE,它从表1和表2的直接关联开始,然后递归地向上查找每个项目的父级,直到遇到parent
为null
的记录。最后,使用LISTAGG
函数将每条链路上的t2_name
按照层级顺序拼接起来,并以t1_name
进行分组,从而得到您想要的输出格式。
请注意,根据实际数据量和递归深度,此查询可能需要一定时间来执行,并且应当注意防止递归过深导致的性能问题。如果存在大量数据或极深的层级关系,可能需要考虑其他优化措施或限制递归深度。