Рекурсивный запрос T-SQL - Линия данных - PullRequest
0 голосов
/ 17 января 2019

С учетом следующей таблицы

enter image description here

Мне нужно получить "происхождение данных" объектов базы данных.

Ожидаемый результат (что-то подобное):

enter image description here

Это скрипт, который я пробовал.

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;

Это вообще как-то возможно?

1 Ответ

0 голосов
/ 17 января 2019

Эта версия делает то, что вы хотите:

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;

Здесь - это дБ <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...