[英]CTE with 3 levels
I am trying to make a CTE with 3 levels.我正在尝试制作具有 3 个级别的 CTE。 Can this be done?这可以做到吗?
I am using this SQL statement for 2 levels.我将这个 SQL 语句用于 2 个级别。 Can you help me to add a third level?你能帮我添加第三级吗?
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';
It doesn't look like you really need a recursive CTE for this.看起来你真的不需要递归 CTE。 It seems like 2 joins would do the trick (depending on what tables you have).似乎 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'
This should also work even if you need to join the same table.即使您需要加入同一张表,这也应该有效。
You can use the below script to check out the results:您可以使用以下脚本检查结果:
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'
You can see the output of the script / query below:可以看到下面脚本/查询的output:
You can have multiple CTE
s in one query, as well as reuse a CTE
:您可以在一个查询中拥有多个CTE
,也可以重用一个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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.