一种基于Oracle数据库实现多行数据并为一行显示的方法
【技术领域】
[0001]本发明涉及Oracle数据库技术领域,尤其是一种基于Oracle数据库实现多行数据并为一行显示的方法。
【背景技术】
[0002]Oracle是甲骨文公司的一款关系数据库管理系统。Oracle的最大列数是1000。
[0003]目前面临的主要问题有:
[0004]在使用Oracle数据库时,经常遇到需要将多行数据合并为一行数据的情况,但通常而言都是编写自定义多行文本合并函数,但是对支持的列数具有局限性。
【发明内容】
[0005]本发明解决的技术问题在于提供一种基于Oracle数据库实现多行数据并为一行显示的方法,解决了在使用Oracle数据库时,需要将多行数据合并为一行数据的情况,并解决了对数据库列数的限制问题。
[0006]本发明解决上述技术问题的技术方案是:
[0007]所述的方法步骤如下:
[0008]步骤一,利用“ROW_NUMBER O OVER (PARTIT1N BY......”为按“部门代码”汇总后的数据行添加组内序号;
[0009]步骤二,“ SYS_CONNECT_BY_PATH”按组内序号相邻关系,为每一层进行不同行的“人员代码”叠加;
[0010]步骤三,再次利用“部门代码进行组内分组,但按第二步中的层次排倒序,增加调整后等级;
[0011]步骤四,取所有调整后等级为I的结果,即为所要求的数据行。
[0012]2、根据权利I要求所述的显示的方法,其特征在于:所述的多行数据指的是:保存了 “部门”与“部门员工”的对应关系数据。
[0013]3、根据权利I或23所述的显示的方法,所述的方法的实现语句为:
[0014]SELECT N_DEPT_CODE, TRANSLATE (LTRIM(text, ' Γ ),'*/','*,')researcherList FROM(SELECT ROff_NUMBER()OVER(PARTIT1N BY N_DEPT_CODE ORDER BYN_DEPT_CODE, Ivl DESC)rn, N_DEPT_CODE, text FROM(SELECT N_DEPT_CODE, LEVEL Ivl,SYS_CONNECT_BY_PATH(C_EMPL0Y_C0DE, ' / ' ) text FROM(SELECT N_DEPT_CODE,C_EMPL0Y_C0DE as C_EMPL0Y_C0DE, ROff_NUMBER()OVER(PARTIT1N BY N_DEPT_CODE ORDERBY N_DEPT_CODE,C_EMPL0Y_C0DE)x FROM m_dept_employ_rel ORDER BY N_DEPT_CODE,C_EMPL0Y_C0DE)a CONNECT BY N_DEPT_CODE = PR1R N_DEPT_CODE AND x_l = PR1R x))WHERE rn = I ORDER BY N_DEPT_CODE。
[0015]本发明的有益效果:本发明的方法可以实现Oracle数据库中需要将多行数据合并为一行数据的情况,并解决了对Oracle数据库列数的限制问题。
【附图说明】
[0016]下面结合附图对本发明进一步说明:
[0017]图1是本发明的流程图。
【具体实施方式】
[0018]如图1所示,本发明的具体步骤为:
[0019]步骤一,创建表结构如下:
[0020]NAME Null Type
[0021]--------------------------------------
[0022]N_DEPT_CODE NOT NULL CHAR (6) —部门
[0023]C_EMPL0Y_C0DE NOT NULL VARCHAR2 (20)—部门员工
[0024]步骤二,插入数据
[0025]此表保存了 “部门”与“部门员工”的对应关系数据,一般而言,对于同一只部门而言,可能有多个员工,对其进行跟踪研宄,需查询出每个部门和对应的员工(员工代码间,使用逗号分隔)。
[0026]例如有如下数据:
[0027]000101 zhanglq
[0028]000101 dingjf
[0029]000101 wenxi
[0030]步骤三,实现SQL步骤:
[0031]1、利用 “ROW—NUMBER()OVER(PARTIT1N BY......”为按“部门代码”汇总后的数据行添加组内序号;
[0032]2、“ SYS_CONNECT_BY_PATH”按组内序号相邻关系,为每一层进行不同行的“人员代码”置加;
[0033]3、再次利用“部门代码进行组内分组,但按第二部中的层次排倒序,增加调整后等级;
[0034]4、取所有调整后等级为I的结果,即为所要求的数据行
[0035]SELECT N_DEPT_CODE, TRANSLATE (LTRIM(text, ' Γ ),'*/','*,')researcherList FROM(SELECT ROff_NUMBER()OVER(PARTIT1N BY N_DEPT_CODE ORDER BYN_DEPT_CODE, Ivl DESC)rn, N_DEPT_CODE, text FROM(SELECT N_DEPT_CODE, LEVEL Ivl,SYS_CONNECT_BY_PATH(C_EMPL0Y_C0DE, ' / ' ) text FROM(SELECT N_DEPT_CODE,C_EMPL0Y_C0DE as C_EMPL0Y_C0DE, ROff_NUMBER()OVER(PARTIT1N BY N_DEPT_CODE ORDERBY N_DEPT_CODE,C_EMPL0Y_C0DE)x FROM m_dept_employ_rel ORDER BY N_DEPT_CODE,C_EMPL0Y_C0DE)a CONNECT BY N_DEPT_CODE = PR1R N_DEPT_CODE AND x_l = PR1R x))WHERE rn = 1RDER BY N_DEPT_CODE ;
[0036]步骤四,执行SQL语句
[0037]执行SQL语句实现的效果为:
[0038]000101 zhanglq,dingjf, wenxi
[0039]步骤五,本发明扩展
[0040]只需要把SQL中“N_DEPT_CODE”换为你的用来汇总的列,“C_EMPLOY_CODE”替换为需合并文本的列,“m_dept_employ_rel”替换为你的表名,即可适用于其他场景。
【主权项】
1.一种基于Oracle数据库实现多行数据并为一行显示的方法,其特征在于:所述的方法步骤如下: 步骤一,利用“ROW_NUMBER() OVER (PARTIT1N BY......”为按“部门代码”汇总后的数据行添加组内序号; 步骤二,“SYS_CONNECT_BY_PATH”按组内序号相邻关系,为每一层进行不同行的“人员代码”叠加; 步骤三,再次利用“部门代码进行组内分组,但按第二步中的层次排倒序,增加调整后等级; 步骤四,取所有调整后等级为I的结果,即为所要求的数据行。2.根据权利I要求所述的显示的方法,其特征在于:所述的多行数据指的是:保存了“部门”与“部门员工”的对应关系数据。3.根据权利I或23所述的显示的方法,所述的方法的实现语句为:SELECTN_DEPT_CODE, TRANSLATE (LTRIM (text, ’/’),’*/’,’*,^researcherList FROM (SELECT R0ff_NUMBER ()OVER(PARTIT1N BY N_DEPT_CODE ORDER BY N_DEPT_CODE, Ivl DESC)rn, N_DEPT_CODE,text FROM(SELECT N_DEPT_CODE, LEVEL lvl,SYS_CONNECT_BY_PATH(C_EMPL0Y_CODE,'/' ) text FROM(SELECT N_DEPT_CODE, C_EMPL0Y_C0DE as C_EMPL0Y_C0DE, R0W_NUMBER OOVER(PARTIT1N BY N_DEPT_C0DE ORDER BY N_DEPT_C0DE, C_EMPL0Y_C0DE) xFROM m_dept_employ_rel ORDER BY N_DEPT_C0DE, C_EMPL0Y_C0DE)a CONNECT BY N_DEPT_CODE = PR1R N_DEPT_C0DE AND x_l = PR1R x))WHERE rn = I ORDER BY N_DEPT_C0DE。
【专利摘要】本发明涉及Oracle数据库技术领域,尤其是一种基于Oracle数据库实现多行数据并为一行显示的方法。本发明方法的步骤如下:1、利用“ROW_NUMBER()OVER(PARTITION BY......”为按“部门代码”汇总后的数据行添加组内序号;2、“SYS_CONNECT_BY_PATH”按组内序号相邻关系,为每一层进行不同行的“人员代码”叠加;3、再次利用“部门代码进行组内分组,但按第二部中的层次排倒序,增加调整后等级;4、取所有调整后等级为1的结果,即为所要求的数据行。本发明解决了在Oracle数据库实现多行数据并为一行显示的问题;可以用于Oracle的数据管理。
【IPC分类】G06F17/30
【公开号】CN104881460
【申请号】CN201510267046
【发明人】张来卿, 徐震宇, 季统凯
【申请人】国云科技股份有限公司
【公开日】2015年9月2日
【申请日】2015年5月22日
转载请注明原文地址:https://www.famiwei.com/read-8138615.html