CTE с 3 уровнями - PullRequest
       9

CTE с 3 уровнями

0 голосов
/ 05 ноября 2019

Я пытаюсь сделать CTE с 3 уровнями. Можно ли это сделать?

enter image description here

Я использую этот оператор SQL для 2 уровней. Можете ли вы помочь мне добавить третий уровень?

WITH ProjectReport(ParentProject, ProjectNr, [Level]) AS   
(  

    SELECT ParentProject, Projectnr, 0 as [Level]
    FROM prproject   
    WHERE ParentProject IS NULL  

    UNION ALL  


    SELECT e.ParentProject, e.ProjectNr, [Level]+1
    FROM PrProject AS e  
    INNER JOIN ProjectReport AS d  
    ON e.ParentProject = d.ProjectNr   

)  

SELECT ParentProject, ProjectNr, [Level]
FROM ProjectReport  
WHERE [Level] <= 2 and ParentProject = 'cl3264';  

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Не похоже, что вам действительно нужен рекурсивный CTE для этого. Кажется, что 2 объединения могут помочь (в зависимости от того, какие таблицы у вас есть).

SELECT A.ProjectNr
    , B.ProjectNr
    , C.ProjectNr
FROM PROJECTS A
    INNER JOIN PROJECTS B ON A.ProjectNr = B.ParentProject
    INNER JOIN PROJECTS C ON B.ProjectNr = C.ParentProject
WHERE A.ProjectNr = 'CL3264'

Это также должно работать, даже если вам нужно присоединиться к одной таблице.

Вы можете использоватьприведенный ниже скрипт для проверки результатов:

CREATE TABLE #PROJECTS (ProjectNr varchar(30), ParentProject varchar(30));

INSERT INTO #PROJECTS (ProjectNr, ParentProject) values ('CL3264', NULL)
    , ('CL3264-B', 'Cl3264')
    , ('CL3264-C1', 'Cl3264')
    , ('CL3264-C2', 'Cl3264')
    , ('CL3264-C3', 'Cl3264')
    , ('CL3264-F1', 'Cl3264')
    , ('CL3264-G1', 'Cl3264')
    , ('CL3264-G2', 'Cl3264')
    , ('CL3264-P', 'Cl3264')
    , ('PR1700000468', 'CL3264-B')
    , ('PR1700000469', 'CL3264-C1')
    , ('PR1700000474', 'CL3264-C2')
    , ('PR1700000475', 'CL3264-C3')
    , ('PR1700000476', 'CL3264-F1')
    , ('PR1700000477', 'CL3264-G1')
    , ('PR1700000478', 'CL3264-G2')
    , ('PR1700000479', 'CL3264-P')
    , ('PR1700000999', 'CL3264-X')
    , ('PR1700009999', 'CL3264-Y')
    , ('CL3264-Y', 'CL2360') -- purposely added to see that the filtering works
    , ('CL3264-X', 'CL2360') -- purposely added to see that the filtering works
    , ('CL2360', NULL)       -- purposely added to see that the filtering works

SELECT A.ProjectNr
    , B.ProjectNr AS Project_Level2
    , C.ProjectNr AS Project_Level3
FROM #PROJECTS A
    INNER JOIN #PROJECTS B ON A.ProjectNr = B.ParentProject
    INNER JOIN #PROJECTS C ON B.ProjectNr = C.ParentProject
WHERE A.ProjectNr = 'CL3264'

Ниже приведен результат выполнения скрипта / запроса:

enter image description here

0 голосов
/ 05 ноября 2019

Вы можете иметь несколько CTE s в одном запросе, а также повторно использовать CTE:

WITH CTE1 AS (
  SELECT TOP 2 Name FROM Sales.Store
), 
CTE2 AS (
  SELECT TOP 2 ProductNumber, Name FROM Production.Product
), 
CTE3 AS (
  SELECT TOP 2 Name FROM Person.ContactType
)
SELECT * FROM CTE1,CTE2,CTE3
-- Or use INNER JOIN, LEFT JOIN instead of Cartesian Joins
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...