【发布时间】:2012-08-29 09:35:11
【问题描述】:
我有一个表 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 与 Category 的关系是一对多的。
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 最终映射到 Name7 是一个类别,因此源是可用的 -- S3
如上所示,所有映射都必须递归解析,直到它们到达 name_type 类别以识别不同的来源。
Expected Result: S1,S2,S3
我正在尝试是否可以使用 listagg 或类似的东西来完成(小的 pl/sql 代码也可以,但如果可能的话更喜欢单选) 我很难递归地做到这一点。 任何帮助将不胜感激。
【问题讨论】:
-
我无法回答自己的问题。因此,我在评论部分回答。
-
感谢任何尝试此操作的人。我尝试使用“connect by”和 listagg 的组合并达到了预期的结果。 select listagg(source,',') within group (order by source) final_source from ( select distinct b.source source--, from taba_parent a, taba b where b.name = a.parent_name and b.name_type = 'Category'通过先前的 a.parent_name = a.name 连接 a.name = 'Name3' );
-
如果您不打算接受其他小伙子的答案之一,请将其发布为答案。
-
我试过了,但是网站不允许我在 48 小时内接受我自己的答案。之后我会接受我自己的答案。