T-SQL递归查询-数据沿袭
给出下表 我需要获得数据库对象的“数据沿袭” 预期输出(类似于此): 这是我试过的剧本T-SQL递归查询-数据沿袭,sql,tsql,recursive-query,Sql,Tsql,Recursive Query,给出下表 我需要获得数据库对象的“数据沿袭” 预期输出(类似于此): 这是我试过的剧本 CREATE TABLE #smth ( ParObj NVARCHAR(200) ,ChilObj NVARCHAR(200) ); INSERT INTO #smth ( ParObj ,ChilObj ) VALUES ( N'FactSales', N'qryFactSales' ) ,( 'qryFac
CREATE TABLE #smth
(
ParObj NVARCHAR(200)
,ChilObj NVARCHAR(200)
);
INSERT INTO #smth (
ParObj
,ChilObj
)
VALUES ( N'FactSales', N'qryFactSales' )
,( 'qryFactSales', 'qryFactSalesOnlineUnited' );
WITH cte
AS (
SELECT ParObj
,ChilObj
,level = 1
,path = CAST('root' AS VARCHAR(100))
FROM #smth
UNION ALL
SELECT t2.ParObj
,t2.ChilObj
,level = t1.level + 1
,Path = CAST(t1.path + ' ||| ' + CAST(t2.ChilObj AS VARCHAR(100)) AS VARCHAR(100))
FROM #smth AS t2
JOIN cte AS t1
ON t1.ChilObj = t2.ParObj
)
SELECT *
FROM cte
ORDER BY cte.path;
甚至可以实现吗?此版本满足您的要求:
with cte as (
select parobj as obj, convert(nvarchar(max), NULL) as path
from smth
where not exists (select 1 from smth smth2 where smth2.chilobj = smth.parobj)
union all
select smth.chilobj as obj, convert(nvarchar(max), coalesce(path + ' -> ', '')) + cte.obj
from cte join
smth
on cte.obj = smth.parobj
)
select obj, coalesce(path + ' -> ' + obj, 'Root')
from cte;
是一个数字小提琴。如果路径相反,您介意分享一个调整吗?因此,qryFactSalesOnlineUnited->qryFactSales->FactSales成为最后一行的FactSales->qryfactsaless->qryFactSalesOnlineUnited(其中obj=FactSales)@Dnac。在递归子查询的第二部分,我将颠倒连接的顺序。如果这不起作用,那么再问另一个问题。