我有一个表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_type存储NAME,PARENT_NAME和NAME列之间的关系。

Datamart与Category的关系是一对多的。

NAME   PARENT_NAME

-----  -----------

Name3  Name1

Name3  Name2

Name3  Name4

Name3  Name5

Name5  Name1

Name5  Name6

Name6  Name7

我的要求是获取NAME_TYPE = Datamart的TABA的源(当前,TABA中不存在)

预期产量:

SOURCE COLUMN FOR Name3

-----------------------

S1,S2,S3

诀窍是递归推导Name3的SOURCE,直到它映射到TABA_PARENT中的Category。

在上面的示例中:

Name3映射到PARENT_NAME Name1,Name2,Name4,Name5。

其中3个(name1,Name2,Name4)属于name_type = Category,因此在TABA中提供了不同的来源-S1,S2

第四个PARENT_NAME Name5是一个name_type Datamart(源信息不可用),需要进一步扩展,直到达到name_type = Category。

我们知道Name5映射到PARENT_NAME Name1,Name6。

Name1是一个类别,因此可以推论出来源。

Name6再次是Datamart。

但是,Name6最终被映射到属于Category的Name7,因此源可用-S3

如上所示,必须递归解析所有映射,直到它们到达name_type Category以标识不同的源。

Expected RESULT: S1,S2,S3

我正在尝试是否可以使用listagg或类似的东西来完成此操作(小的pl / sql代码也可以,但是如果可能的话,请选择单选)

我很难递归地执行此操作。

任何帮助将非常感激。

我无法回答自己的问题。 因此,我在评论部分中回答。

感谢任何尝试此操作的人。 我尝试使用" connect by"和listagg的组合,并达到了预期的效果。 在组(按源排序)中选择listagg(source ,,),按final_source从(选择不同的b.source源-,从taba_parent a,taba b中选择,其中b.name = a.parent_name和b.name_type = Category按先前a连接 .parent_name = a.name以a.name = Name3开头);

如果您不愿意接受其他第一章的答案之一,则将其发布为答案。

我试图这样做,但是该网站不允许我接受48小时的自己的答案。 之后,我将接受自己的回答。

如注释中所述,可以使用listagg()的组合来完成此操作,该组合可从Oracle 11.2及更高版本和connect by获得。如果您不使用11.2,则还有许多其他字符串聚合技术可用。

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演示。

谢谢大家,我看到提供的解决方案与我提出的解决方案相同,并且所有这些工作都可以解决。

感谢任何尝试此操作的人。

我尝试使用" 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'

CONNECT BY prior a.parent_name = a.name

START WITH a.name = 'Name3'

);

您需要一个层次查询(connect by)来获得"最终父母",然后您需要使用listagg将各项串联在一起。我只有Oracle 10g,所以没有listagg。这是层次结构位:

SELECT DISTINCT SOURCE FROM

(

SELECT taba_parent.name, taba_parent.parent_name, taba.source

FROM

taba_parent

INNER JOIN taba ON taba_parent.parent_name = taba.name

)

WHERE name IN (SELECT name FROM taba WHERE name_type = 'Datamart')

CONNECT BY name = parent_name

START WITH SOURCE IS NOT NULL

这给出:

SOURCE

S3

S2

S1

您可以使用listagg获取S3,S2,S1

谢谢大家,我看到提供的解决方案与我在您的回复和所有这些工作之前提出的解决方案相同。

oracle获取行的值给产量,递归oracle sql识别值相关推荐

  1. oracle 获得月最后一天,oracle获取本月第一天和最后一天及Oracle trunc()函数的用法...

    select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天", to_cha ...

  2. oracle 多行数据列合并成一行,Oracle 多行数据合并成一行

    方案一:wm_concat函数 select username, id, wmsys.wm_concat(subject) as subject, wmsys.wm_concat(score) as ...

  3. oracle记录合并,Oracle多行记录合并处理

    1:效果如下图所示: 表T1: CREATE TABLE T1 ( WEEKWORKID VARCHAR2(20) , DD VARCHAR2(20) ) 表T2 CREATE TABLE T2 ( ...

  4. 月数oracle,Oracle 获取目前年、月、日

    Oracle 获取当前年.月.日 Oracle 获取当前年.月.日1.//oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分 ...

  5. oracle 行转列后列名,Oracle 多行转多列,列值转为列名

    前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...

  6. oracle一列多行转一行多列表示,Oracle 多行转多列,列值转为列名

    前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...

  7. python怎么选取第几行第几列_python DataFrame获取行数、列数、索引及第几行第几列的值方法...

    python DataFrame获取行数.列数.索引及第几行第几列的值方法 更新时间:2018年04月08日 16:22:00 作者:小白九九 下面小编就为大家分享一篇python DataFrame ...

  8. oracle怎么获取行,在oracle中如何实现SELECT TOP N取得前几行记录

    在sql server中可以通过SELECT TOP N来取得想要结果的前几行的信息. 但是在oracle中必须借助伪列rownum来完成 一个查询语句在取得结果集后,伪列rownum就会从1开始,从 ...

  9. C#Winform中DataGridView控件下的右键菜单事件获取行值方法

    //首先生成DataGridView的CellMouseDown事件private void dataGridView1_CellMouseDown(object sender, DataGridVi ...

最新文章

  1. seaborn可视化散点图并自定义图像的标题(title)以及自定义标题的字体大小(Set a Title to a Seaborn Plot)
  2. mysql必知必会_《MySQL必知必会》学习小结
  3. Hyperledger Fabric 超级账本的硬伤
  4. Python编程基础:第二十三节 嵌套函数调用Nested Functions Calls
  5. 它抢不走程序员的饭碗,但是会让一部分人瑟瑟发抖
  6. axure中的拐弯箭头_Axure 8.0制作水平方向上一直来回移动的箭头
  7. python如何测试仪器_如何测试pytest设备本身?
  8. 怎么写字_写字楼外卖员不让进怎么办?写字楼外卖柜提供解决方案!
  9. 模式8--WorkerThread
  10. 支付渠道参数如何设计成路由化配置
  11. 多线程编程 RW_LOCK 读写锁
  12. 学计算机信息管理专业的感谢,计算机信息管理专业工作求职信
  13. 在Ubuntu 18.04中更改时区
  14. 逻辑回归与梯度下降法
  15. 毕业论文封面LaTeX模板
  16. h264文件视频存储格式和音频存储格式
  17. 如何进行时间管理?31页时间管理技能PPT教你
  18. android 炫飞 打印机,手机拍照打印机推荐 佳能炫飞CP1200打印机介绍【详解】
  19. 点击吐丝用mvp模式实现--狸菇凉_
  20. 用了这么多年PPT才知道,按下这个键,200页Word秒转PPT

热门文章

  1. java:Eclipse插件springsource-tool-suite的下载和安装
  2. pwershell custom objects
  3. PyQt4设置窗口左上角的小图标
  4. python 将数据写入excel
  5. 51单片机 | 基于I2C总线的秒表模拟应用
  6. 【原】聊聊js代码异常监控
  7. 2021年终总结模板.pptx(附下载链接)
  8. AI换脸APP“ZAO”刷屏并一夜爆火,它能红多久?
  9. 不可错过!斯坦福课程3D数据的机器学习方法(Machine Learning for 3D Data)第一部分
  10. 【优秀选手采访】看十强选手如何顺利拿下腾讯offer