oracle获取行的值给产量,递归oracle sql识别值
我有一个表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识别值相关推荐
- oracle 获得月最后一天,oracle获取本月第一天和最后一天及Oracle trunc()函数的用法...
select to_char(trunc(add_months(last_day(sysdate), -1) + 1), 'yyyy-mm-dd') "本月第一天", to_cha ...
- oracle 多行数据列合并成一行,Oracle 多行数据合并成一行
方案一:wm_concat函数 select username, id, wmsys.wm_concat(subject) as subject, wmsys.wm_concat(score) as ...
- oracle记录合并,Oracle多行记录合并处理
1:效果如下图所示: 表T1: CREATE TABLE T1 ( WEEKWORKID VARCHAR2(20) , DD VARCHAR2(20) ) 表T2 CREATE TABLE T2 ( ...
- 月数oracle,Oracle 获取目前年、月、日
Oracle 获取当前年.月.日 Oracle 获取当前年.月.日1.//oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分 ...
- oracle 行转列后列名,Oracle 多行转多列,列值转为列名
前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...
- oracle一列多行转一行多列表示,Oracle 多行转多列,列值转为列名
前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...
- python怎么选取第几行第几列_python DataFrame获取行数、列数、索引及第几行第几列的值方法...
python DataFrame获取行数.列数.索引及第几行第几列的值方法 更新时间:2018年04月08日 16:22:00 作者:小白九九 下面小编就为大家分享一篇python DataFrame ...
- oracle怎么获取行,在oracle中如何实现SELECT TOP N取得前几行记录
在sql server中可以通过SELECT TOP N来取得想要结果的前几行的信息. 但是在oracle中必须借助伪列rownum来完成 一个查询语句在取得结果集后,伪列rownum就会从1开始,从 ...
- C#Winform中DataGridView控件下的右键菜单事件获取行值方法
//首先生成DataGridView的CellMouseDown事件private void dataGridView1_CellMouseDown(object sender, DataGridVi ...
最新文章
- 《高性能javascript》 领悟随笔之-------DOM编程篇(二)
- 攻防世界 ——crypto
- java读取C++结构体,类型转换
- 数列分块入门 5(LibreOj-6281)
- python3中maketrans()方法的使用
- MVC应用程序播放FLV视频,部分视图可多地方重复引用
- 分享AceAdminUI后台框架-你喜欢吗?
- Silverlight实现文件下载
- 关于Android 微信APP支付开发中遇到的问题
- 飞思卡尔单片机学习记录(一)
- 阿里云0元注册域名 云服务有了免费入口
- 联想微型计算机安装Win7,联想c340如何安装win7_联想c430一体机改win7系统步骤
- Git中HEAD和ORIG_HEAD指针指的是什么
- 奇迹mu开服教程:开服服务端的架设及服务器推荐需要那些东西
- C中 stdarg.h
- android killer 连接模拟器,AndroidKiller怎么连接夜游神手机模拟器的方法教程
- VB.NET 通过vbs发送微信消息
- 边缘检测论文简读、开源代码和数据集合集
- Android震动和自定义铃声
- 华为设备配置Smart Link负载分担
热门文章
- pwershell custom objects
- Java——标准异常
- TCL_事务控制语言
- [转] Mou 一个Markdown工具 语法规则文档(最后)
- DesignPattern_Java:Proxy Pattern
- require.js初识
- 常见错误Delegate already added to touch dispatcher.的解决方案
- 【报告分享】科技抗疫,5G助力:5G通信为公共卫生防控诊疗体系带来的新契机.pdf...
- 速成pytorch学习——10天.训练模型的3种方法
- 迭代最近点算法Iterative Closest Point(ICP)以及c++实现代码