@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
db<>fiddle
当您添加更多级别的文件夹时,这种方法可能会更好;但是它们都必须在 pivot 子句中定义,所以它仍然不完全灵活。
如果您还想要文件夹 ID,则将它们包含在层次结构/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
Updated db<>fiddle