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.
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