Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 分层表多次合并自身_Sql_Obiee_Plsql Psp - Fatal编程技术网

Sql 分层表多次合并自身

Sql 分层表多次合并自身,sql,obiee,plsql-psp,Sql,Obiee,Plsql Psp,? 上面的链接我解释了一切你不喜欢这个网站的原因是什么?说明问题答案的答案是否与您描述的结果不同 编辑: 一种使用这种技术的方法。这是我自2002年(在9iAS上)以来编写的第一个基于Oracle的查询 弗兰克·库拉什指出: 结果集中的列数必须硬编码到查询中。您现在可以编写生成30列的代码(也就是说,对于层次结构中的10个级别来说足够了),但是如果您稍后更改数据,使其包含11个或更多级别,那么您的查询将开始丢失结果 稍后我可能会回来尝试一个PIVOT功能。甲骨文就是疯狂 编辑: 但这是可以管理的

?


上面的链接我解释了一切

你不喜欢这个网站的原因是什么?说明问题答案的答案是否与您描述的结果不同

编辑

一种使用这种技术的方法。这是我自2002年(在9iAS上)以来编写的第一个基于Oracle的查询

弗兰克·库拉什指出:

结果集中的列数必须硬编码到查询中。您现在可以编写生成30列的代码(也就是说,对于层次结构中的10个级别来说足够了),但是如果您稍后更改数据,使其包含11个或更多级别,那么您的查询将开始丢失结果

稍后我可能会回来尝试一个
PIVOT
功能。甲骨文就是疯狂

编辑

但这是可以管理的。静态
工作。我无法让
交叉应用
像我认为的那样使用
(MSSQL样式),所以我放弃了它,用它代替了一个可通过的
联合所有
。有可能使用这种方法进行一些动态SQL工作,因此它实际上可以在不硬编码列的情况下完成您需要的工作

SELECT  REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 1 )    Header1,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 1 )     Header2,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 1 )   Header3,

        REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 2 )    Header4,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 2 )     Header5,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 2 )   Header6,

        REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 3 )    Header7,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 3 )     Header8,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 3 )   Header9,

        REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 4 )    Header10,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 4 )     Header11,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 4 )   Header12,

        REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 5 )    Header13,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 5 )     Header14,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 5 )   Header15

        --,REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, n )    
        --,REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, n )     
        --,REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, n )

FROM (  SELECT  LEVEL                                RootLvl,
                b.ID                                 RootID,
                SYS_CONNECT_BY_PATH( b.PARENT_ID, ',' )
                    || ','                           PIDPath,
                SYS_CONNECT_BY_PATH( b.ID, ',' )        
                    || ','                           IDPath,
                SYS_CONNECT_BY_PATH( b.NAME, ',' )                       
                    || ','                           NamePath
        FROM    t b
        START WITH b.PARENT_ID = '1'
        CONNECT BY NOCYCLE PRIOR b.ID = b.PARENT_ID ) a
ORDER BY a.RootLvl, a.RootID;

请不要使用链接来描述问题。该链接将来可能不存在。编辑您的问题并添加相关信息。对不起,我会尽快编辑。现代方法是递归CTE是的,当然,如果您仔细查看我所示的表格,您会发现它们不是相同的输出。我没有看到,但还有更多的建议。我想你想要的是更接近我发布的第二件事——可以动态生成以增加灵活性。
SELECT  REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 1 )    Header1,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 1 )     Header2,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 1 )   Header3,

        REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 2 )    Header4,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 2 )     Header5,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 2 )   Header6,

        REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 3 )    Header7,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 3 )     Header8,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 3 )   Header9,

        REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 4 )    Header10,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 4 )     Header11,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 4 )   Header12,

        REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, 5 )    Header13,
        REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, 5 )     Header14,
        REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, 5 )   Header15

        --,REGEXP_SUBSTR( a.PIDPath, '[^,]+', 1, n )    
        --,REGEXP_SUBSTR( a.IDPath, '[^,]+', 1, n )     
        --,REGEXP_SUBSTR( a.NamePath, '[^,]+', 1, n )

FROM (  SELECT  LEVEL                                RootLvl,
                b.ID                                 RootID,
                SYS_CONNECT_BY_PATH( b.PARENT_ID, ',' )
                    || ','                           PIDPath,
                SYS_CONNECT_BY_PATH( b.ID, ',' )        
                    || ','                           IDPath,
                SYS_CONNECT_BY_PATH( b.NAME, ',' )                       
                    || ','                           NamePath
        FROM    t b
        START WITH b.PARENT_ID = '1'
        CONNECT BY NOCYCLE PRIOR b.ID = b.PARENT_ID ) a
ORDER BY a.RootLvl, a.RootID;
;
WITH c ( RID, ID, PARENT_ID, NAME ) AS (
    SELECT  ROW_NUMBER() OVER (
            ORDER BY PARENT_ID )        RID,
            ID, PARENT_ID, NAME
    FROM    t
    UNION ALL
    SELECT  b.RID, a.ID, a.PARENT_ID, a.NAME
    FROM    t a,
            c b
    WHERE   a.ID = b.PARENT_ID
)
SELECT  p."'ID_1'"                              Header1,
        p."'PARENT_ID_1'"                       Header2,
        p."'NAME_1'"                            Header3,
        p."'ID_2'"                              Header4,
        p."'PARENT_ID_2'"                       Header5,
        p."'NAME_2'"                            Header6,
        p."'ID_3'"                              Header7,
        p."'PARENT_ID_3'"                       Header8,
        p."'NAME_3'"                            Header9,
        p."'ID_4'"                              Header10,
        p."'PARENT_ID_4'"                       Header11,
        p."'NAME_4'"                            Header12,
        p."'ID_5'"                              Header13,
        p."'PARENT_ID_5'"                       Header14,
        p."'NAME_5'"                            Header15
FROM (  SELECT  RID, 
                'ID_' || ROW_NUMBER() OVER (
                    PARTITION BY RID
                    ORDER BY ID )               KeyName,
                ID                              KeyValue
        FROM    c
        UNION ALL
        SELECT  RID, 
                'PARENT_ID_' || ROW_NUMBER() OVER (
                    PARTITION BY RID
                    ORDER BY ID )               KeyName,
                PARENT_ID                       KeyValue
        FROM    c
        UNION ALL
        SELECT  RID, 
                'NAME_' || ROW_NUMBER() OVER (
                    PARTITION BY RID
                    ORDER BY ID )               KeyName,
                CAST( NAME AS VARCHAR2( 200 ) ) KeyValue
        FROM    c ) s
PIVOT ( MAX( KeyValue ) FOR KeyName IN (
            'ID_1', 'PARENT_ID_1', 'NAME_1',
            'ID_2', 'PARENT_ID_2', 'NAME_2',
            'ID_3', 'PARENT_ID_3', 'NAME_3',
            'ID_4', 'PARENT_ID_4', 'NAME_4',
            'ID_5', 'PARENT_ID_5', 'NAME_5' ) ) p
ORDER BY p.RID;