gpt4 book ai didi

sql - 递归oracle sql来识别一个值

转载 作者:行者123 更新时间:2023-12-04 18:12:54 24 4
gpt4 key购买 nike

我有一个表 TABA(PK:NAME) 以这种方式存储 NAME,NAME_TYPE,SOURCE :

NAME  NAME_TYPE SOURCE
---- --------- ------
Name1 Category S1
Name2 Category S2
Name3 Datamart
Name4 Category S1
Name5 Datamart
Name6 Datamart
Name7 Category S3

上面的注意事项:仅当 NAME_TYPE = Category 时,源才会出现在数据中。

我有另一个表 TABA_PARENT 存储 NAME,PARENT_NAME 以及基于 name_type 的 NAME 列之间的关系。
Datamart 与类别的关系是一对多的。
  NAME   PARENT_NAME
----- -----------
Name3 Name1
Name3 Name2
Name3 Name4
Name3 Name5
Name5 Name1
Name5 Name6
Name6 Name7

我的要求是获取 TABA 的 SOURCE,其中 NAME_TYPE = Datamart(目前,TABA 中不存在)

预期输出:
SOURCE column for Name3
-----------------------

S1,S2,S3

诀窍是递归地推导出 Name3 的 SOURCE,直到它映射到 TABA_PARENT 中的类别。

在上面的例子中:

Name3 映射到 PARENT_NAME Name1,Name2,Name4,Name5。
其中 3 个(name1,Name2,Name4)属于 name_type = Category,因此 TABA 中提供了不同的来源——S1、S2
第四个PARENT_NAME Name5是name_type Datamart(source info not available),需要进一步扩展,直到达到name_type = Category。

我们有 Name5 映射到 PARENT_NAME Name1,Name6 的信息。
Name1 是一个类别,因此可以推断出来源。
Name6 又是一个数据集市。

但是,Name6 最终映射到作为 Category 的 Name7,因此源可用——S3

如上所示,所有映射都必须递归解析,直到它们到达 name_type 类别以识别不同的源。
Expected Result: S1,S2,S3 

我正在尝试是否可以使用 listagg 或类似的东西来完成(小的 pl/sql 代码也可以,但如果可能的话,更喜欢单选)
我很难递归地做到这一点。
任何帮助将非常感激。

最佳答案

如评论中所述,这可以通过 listagg() 的组合来完成。 ,从 Oracle 11.2 和 connect by 开始提供.如果您不使用 11.2,则有 a number of other string aggregation techniques available .

select listagg(source, ',' ) within group ( order by source )
from ( select distinct source
from taba a
join ( select parent_name
from taba_parent
start with name = 'Name3'
connect by prior parent_name = name
) b
on a.name = b.parent_name
)
distinct子查询之所以存在,是因为您有多个相同的来源。这将返回 S1,S2,S3 .
为了获得相同的名称,您可以更改 START WITH 子句;例如将其更改为 start with name = 'Name5'返回 S1,S3 .
数据集市没有来源这一事实并不重要,因为您在 taba_parent 上使用分层查询。仅限表,加入 taba仅当您拥有所需信息时才能使用表格。
这里有一点 SQL Fiddle展示。

关于sql - 递归oracle sql来识别一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12268334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com