oracle多行合并

来源:互联网 发布:2016新款羊绒衫淘宝网 编辑:程序博客网 时间:2024/05/30 20:09
SELECT ROW_NUMBER ()                      OVER (PARTITION BY ChgNumber ORDER BY ChgNumber, InsideID)                      NumId,                   ChgNumber,                   InvoiceNumber              FROM "000".tbChgInvoiceDetail

11 111122  33 1234120100919000003 51201109140000011312321321361201109140000021123123123127120110921000005 8120110921000006 9120110921000039 10120110921000040 11120110921000041 12120110921000083 1312011092100010521312313141201109270000015551522011092700000166616120111216000004198517120111219000002 18120111219000003 19120111219000008 20120111220000001 21120120221000002 22120120229000004 2312012022900000512424120120229000006 2512012022900000812326120120331000002 27120120411000001 2812012041100000211111292201204110000022222230120120417000001 31120120430000006 32120120430000007 33120120430000008 34120120616000001135120120811000001 36120120811000002 37120120811000003 38120120811000004 39120120811000005 40220120811000005 411201208150000021234222012081500000212443120120817000001 44120120820000004 45120120821000002 46120120821000005 47120120821000006 

    SELECT ChgNumber,           LTRIM (MAX (SYS_CONNECT_BY_PATH (InvoiceNumber, ',')), ',') InvoiceNumber                    FROM (SELECT ROW_NUMBER ()                      OVER (PARTITION BY ChgNumber ORDER BY ChgNumber, InsideID)                      NumId,                   ChgNumber,                   InvoiceNumber              FROM "000".tbChgInvoiceDetail)START WITH NumId = 1CONNECT BY Numid - 1 = PRIOR NumId AND ChgNumber = PRIOR ChgNumber  GROUP BY ChgNumber

1 123, ,1111220100919000003 32011091400000113123213213420110914000002112312312312520110921000005 620110921000006 720110921000039 820110921000040 920110921000041 1020110921000083 1120110921000105213123131220110927000001555,666132011121600000419851420111219000002 1520111219000003 1620111219000008 1720111220000001 1820120221000002 1920120229000004 20201202290000051242120120229000006 22201202290000081232320120331000002 2420120411000001 252012041100000211111,222222620120417000001 2720120430000006 2820120430000007 2920120430000008 302012061600000113120120811000001 3220120811000002 3320120811000003 3420120811000004 3520120811000005 , 3620120815000002123,1243720120817000001 3820120820000004 3920120821000002 4020120821000005 4120120821000006 


 

 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:
org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。
用上述语法的查询可以取得这棵树的所有记录。
其中:
条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录。
条件3 是过滤条件,用于对返回的所有记录进行过滤。

 

       自从Since Oracle 9i 开始,就可以通过 SYS_CONNECT_BY_PATH 函数实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来。 如下例所示:
在 Oracle 10g 中,还有其他更多关于层次查询的新特性 。例如,有的时候用户更关心的是每个层次分支中等级最低的内容。那么你就可以利用伪列函数CONNECT_BY_ISLEAF来判断当前行是不是叶子。如 果是叶子就会在伪列中显示“1”,如果不是叶子而是一个分支(例如当前内容是其他行的父亲)就显示“0”。下给出了一个关于这个函数使用的例子:
在Oracle 10g 中还有一个新操作——CONNECT_BY_ROOT。 它用在列名之前用于返回当前层的根节点。如下面的例子,我可以显示出层次结构表中当前行数据所对应的最高等级节点的内容。

 

       为了更好的查询一个树状结构的表,在Oracle的PL/SQL中提供乐一个诱人的特性——CONNECT BY子句。它大大的方便了我们查找树状表:遍历一棵树、寻找某个分支……,但还是存在一些不足。在Oracle 10G,就对这个特性做了增强。下面就举例说明一下:CONNECT_BY_ROOT一张表,有多颗子树(根节点为0),现在我想知道每个节点属于哪个子树。举例:铃音目录结构下有多个大分类:中外名曲、流行经典、浪漫舞曲……,每个大类下面又有多个子类,子类下面还可以细分。那现在想要知道每个子类分属哪个大类,或者要统计每个大类下面有多少个子类。看下面的例子,DIRINDEX分别为1、2、3的就是大分类,其他编号的都是子类或孙子类:select dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname from t_tonedirlibstart with fatherindex = 0