2016-11-07 2 views
1

Ich verwende rekursive SQL und ich habe eine Abfrage, wie diesewie durch Attribut in einem connect von SQL

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid 
    FROM FOLDER_Table 
    START WITH FOLDERID=12345 CONNECT by PRIOR PARENTFOLDERID=FOLDERID 

beginnen zu holen, wie ich die OrdnerId anzeigen kann ich in FolderID = 12345 in der Auswahl gebe Attribute? wenn ich unter Abfrage ausführen

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid, folderId 
    FROM FOLDER_Table 
    START WITH FOLDERID=12345 CONNECT by PRIOR PARENTFOLDERID=FOLDERID 

Ich erhalte OrdnerId root entspricht, aber nicht 12345

+2

Eine kleine Datenprobe, die immer noch alle Komplikationen des realen Problems widerspiegelt, die Logik der Anforderung und die Ausgabe aus den Beispieldaten sind viel nützlicher als das Veröffentlichen Ihres Codeversuchs. Sie bitten uns, das Problem aus einer Antwort zu erraten, die nicht funktioniert, und das macht nicht viel Sinn, oder? – mathguy

Antwort

1

Sie CONNECT_BY_ROOT verwenden können, die Wurzel der Hierarchie zu erhalten, die in diesem Fall - weil, wie Sie es sind durchqueren - ist die ID, die Sie angegeben:

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path, 
    parentfolderid, CONNECT_BY_ROOT(folderId) as queried_folderid 
FROM FOLDER_Table 
START WITH FOLDERID=12345 
CONNECT by PRIOR PARENTFOLDERID=FOLDERID; 

Schnell Demo mit einigen Dummy-Daten:

create table folder_table (folderid, parentfolderid, name) as 
    select 12345, 1234, 'FolderE' from dual 
    union all select 1234, 123, 'FolderD' from dual 
    union all select 123, 12, 'FolderC' from dual 
    union all select 12, 1, 'FolderB' from dual 
    union all select 1, null, 'FolderA' from dual 
    union all select 12346, null, 'FolderF' from dual 
; 

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path, 
    parentfolderid, CONNECT_BY_ROOT(folderId) as queried_folderid 
FROM FOLDER_Table 
START WITH FOLDERID=12345 
CONNECT by PRIOR PARENTFOLDERID=FOLDERID; 

PATH            PARENTFOLDERID UERIED_FOLDERID 
-------------------------------------------------- -------------- --------------- 
FolderE\              1234   12345 
FolderD\FolderE\            123   12345 
FolderC\FolderD\FolderE\          12   12345 
FolderB\FolderC\FolderD\FolderE\        1   12345 
FolderA\FolderB\FolderC\FolderD\FolderE\         12345 

Wenn Sie auf 11gR2 oder höher y sind ou könnte recursive subquery factoring auch anstelle von connect by Syntax verwenden, die die Umkehrung vermeiden:

WITH r (path, parentfolderid, queriedfolderid) AS (
    SELECT name ||'\', parentfolderid, folderid 
    FROM folder_table 
    WHERE folderid = 12345 
    UNION ALL 
    SELECT ft.name ||'\'|| r.path, ft.parentfolderid, r.queriedfolderid 
    FROM r 
    JOIN folder_table ft ON ft.folderid = r.parentfolderid 
) 
SELECT * 
FROM r; 

PATH            PARENTFOLDERID QUERIEDFOLDERID 
-------------------------------------------------- -------------- --------------- 
FolderE\              1234   12345 
FolderD\FolderE\            123   12345 
FolderC\FolderD\FolderE\          12   12345 
FolderB\FolderC\FolderD\FolderE\        1   12345 
FolderA\FolderB\FolderC\FolderD\FolderE\         12345 

Das Ankerelement wird Ihre erste Zielzeile, und das rekursive Element prepends das nächsthöheren Ordnernamen Niveau, während sie durch was auch immer andere Informationen, die Sie behalten wollen.

0
SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid, :start_folder 
    FROM FOLDER_Table 
    START WITH FOLDERID=:start_folder CONNECT by PRIOR PARENTFOLDERID=FOLDERID 

Oder nur

SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid, 12345 as folderId 
    FROM FOLDER_Table 
    START WITH FOLDERID=12345 CONNECT by PRIOR PARENTFOLDERID=FOLDERID 

Ist das, was Sie brauchen?

Sub-Abfrage so würde ich gehen für:

with subquery as (/*YOUR SUBQUERY*/) 
select * from (
SELECT REVERSE(SYS_CONNECT_BY_PATH(REVERSE(name), '\')) as Path,parentfolderid, 12345 as folderId 
     FROM FOLDER_Table 
     START WITH FOLDERID=(select 1 from subquery) CONNECT by PRIOR PARENTFOLDERID=FOLDERID), subquery; 
+0

Ich habe ein Szenario, in dem ich eine Unterabfrage am Anfang mit verwenden werde. In diesem Fall, wie würden Sie sagen: start_folder – dreambigcoder

+0

@dvanwesh nicht die schönste Lösung, aber vielleicht wird es für Sie nützlich sein – Kacper

Verwandte Themen