@ PonderStibbons показал, как это сделать с левыми внешними объединениями; Вы также можете использовать иерархический запрос и повернуть результаты:
with cte (FolderName, BaseFolderId, lvl) as (
select FolderName, connect_by_root(FolderId), level
from table2
connect by FolderId = prior ParentFolderId
)
select *
from (
select t1.DocName,
c.FolderName,
c.lvl
from table1 t1
join cte c on c.BaseFolderId = t1.FolderId
)
pivot (
max(FolderName) for lvl in (1 as ChildFolder, 2 as ParentFolder, 3 as GrandparentFolder)
);
DOCNAME CHILDFOLDER PARENTFOLDER GRANDPARENTFOLDER
------- ----------- ------------ -----------------
jkl.xlx dcg
Abc.xlx lmn pqr dcg
rst.xlx pqr dcg
или с рекурсивным факторингом подзапроса вместо иерархического запроса:
with rcte (FolderName, ParentFolderId, BaseFolderId, lvl) as (
select FolderName, ParentFolderId, FolderId, 1 from table2
union all
select t2.FolderName, t2.ParentFolderId, r.BaseFolderId, r.lvl + 1
from rcte r
join table2 t2 on t2.FolderId = r.ParentFolderId
)
select *
from (
select t1.DocName,
r.FolderName,
r.lvl
from table1 t1
join rcte r on r.BaseFolderId = t1.FolderId
)
pivot (
max(FolderName) for lvl in (1 as ChildFolder, 2 as ParentFolder, 3 as GrandparentFolder)
);
DOCNAME CHILDFOLDER PARENTFOLDER GRANDPARENTFOLDER
------- ----------- ------------ -----------------
jkl.xlx dcg
Abc.xlx lmn pqr dcg
rst.xlx pqr dcg
дб <> скрипка
Такой подход может быть лучше, если вы добавите больше уровней папок; но все они должны быть определены в предложении pivot, поэтому он все еще не полностью гибок.
Если вы хотите также идентификаторы папок, включите их в иерархию / CTE и поверните оба:
with rcte (FolderName, FolderId, ParentFolderId, BaseFolderId, lvl) as (
select FolderName, FolderId, ParentFolderId, FolderId, 1 from table2
union all
select t2.FolderName, t2.FolderId, t2.ParentFolderId, r.BaseFolderId, r.lvl + 1
from rcte r
join table2 t2 on t2.FolderId = r.ParentFolderId
)
select *
from (
select t1.DocName,
r.FolderId,
r.FolderName,
r.lvl
from table1 t1
join rcte r on r.BaseFolderId = t1.FolderId
)
pivot (
max(FolderName), max(FolderId) as id
for lvl in (1 as ChildFolder, 2 as ParentFolder, 3 as GrandparentFolder)
);
DOCNAME CHILDFOLDER CHILDFOLDER_ID PARENTFOLDER PARENTFOLDER_ID GRANDPARENTFOLDER GRANDPARENTFOLDER_ID
------- ----------- -------------- ------------ --------------- ----------------- --------------------
jkl.xlx dcg 98763
Abc.xlx lmn 98765 pqr 98764 dcg 98763
rst.xlx pqr 98764 dcg 98763
Обновлен дБ <> скрипка