简体   繁体   English

CTE 3 级

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM