开发者社区 问答 正文

合并并检查SQL上的表值(ORACLE)

表格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 有帮助吗?

展开
收起
保持可爱mmm 2019-12-18 16:58:17 391 分享 版权
阿里云 AI 助理回答

要实现您所描述的功能,即递归查询并展示表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的直接关联开始,然后递归地向上查找每个项目的父级,直到遇到parentnull的记录。最后,使用LISTAGG函数将每条链路上的t2_name按照层级顺序拼接起来,并以t1_name进行分组,从而得到您想要的输出格式。

请注意,根据实际数据量和递归深度,此查询可能需要一定时间来执行,并且应当注意防止递归过深导致的性能问题。如果存在大量数据或极深的层级关系,可能需要考虑其他优化措施或限制递归深度。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答