2016-06-28 57 views
1

我有三个SQL Server表:Projects,ProjectTree,ProjectTreeRecSelect SQL语句中的递归

Projects类似于目录,我试图找到一个名为Standard Parts目录下的所有子目录。显然这里需要递归。

Projects表有以下几列:

ProjectID, Name, Deleted 

ProjectTree表有以下几列:

ProjectID, ChildProject 

我不相信我所需要的ProjectTreeRec表作为这一努力的一部分,但它包含列ChildProjectID,ParentProjectID,Level

我想开发一个递归选择语句来查找Standard Parts目录下的所有子目录,这些子目录还没有被删除(不是1,但是0)。

我是新来的CTE和递归。我得到了一些结果,但不是我所追求的。

这是非递归调用,它使我找到了第一个级别,但没有更深入。它工作正常。

SELECT 
    '(Directory Not Available)' 

UNION 

SELECT DISTINCT 
    C.[Name] 
FROM 
    [EPDM].[dbo].[Projects] A 
JOIN 
    [EPDM].[dbo].[ProjectTree] B ON B.ProjectID = A.ProjectID 
JOIN 
    [EPDM].[dbo].[Projects] C ON B.childproject = C.projectid 
WHERE 
    A.name = 'Standard Part Library' 
    AND A.[Deleted] = 0; 

欢迎任何帮助。

+0

您正在使用哪个版本的SQL服务器? –

+0

您可以检查递归CTE:http://stackoverflow.com/questions/37973842/get-all-duplicate-data-by-parent-or-child-id-sql-server/37975448#37975448 –

+0

我正在使用SQL Server标准2014 – CodeWriter

回答

0

我会尝试像以评估树结构,然后加入CTE到表中,以获得名称如下:

DECLARE @SearchProjectID int = 1; 

WITH cteTree AS(
SELECT ProjectID, ChildProject 
    FROM ProjectTree 
    WHERE ProjectID = @SearchProjectID 
UNION ALL 
SELECT pt.ProjectID, pt.ChildProject 
    FROM ProjectTree AS pt 
    JOIN cteTree AS ct ON ct.ChildProject = pt.ProjectID 
) 
SELECT * 
    FROM cteTree 
0

请试试这个...

CREATE TABLE #Project 
 
(
 
ProjectID INT 
 
,Name varchar(50) 
 
,Deleted bit 
 
) 
 

 
CREATE TABLE #ProjectTree 
 
(
 
ProjectID INT, 
 
ChildProject INT 
 
) 
 

 
INSERT INTO #Project 
 
(ProjectID,Name,Deleted) 
 
SELECT 1,'Standard Part Library',0 
 
UNION ALL SELECT 2,'P2',1 
 
UNION ALL SELECT 3,'P3',0 
 
UNION ALL SELECT 4,'P4',0 
 

 
INSERT INTO #ProjectTree 
 
(ProjectID,ChildProject) 
 
SELECT 1,3 
 
UNION SELECT 2,4 
 

 
SELECT * FROM #Project 
 
SELECT * FROM #ProjectTree 
 

 
;WITH CTE_Project 
 
AS 
 
(
 
SELECT 
 
\t A.ProjectId 
 
\t ,B.ChildProject 
 
\t ,A.Name AS ProjectName 
 
FROM #Project A 
 
\t INNER JOIN #ProjectTree B 
 
\t \t ON A.ProjectId = B.ProjectId 
 
WHERE 
 
\t A.Name = 'Standard Part Library' 
 
\t AND A.[Deleted] = 0 
 

 
UNION ALL 
 

 
SELECT 
 
\t PT.ProjectID 
 
\t ,PT.ChildProject 
 
\t ,CP.ProjectName AS ProjectName 
 
FROM 
 
\t #ProjectTree AS PT 
 
\t INNER JOIN CTE_Project CP 
 
\t \t ON PT.ChildProject = CP.ProjectID 
 
) 
 
SELECT 
 
ProjectName 
 
,ProjectId 
 
,ChildProject 
 
FROM 
 
CTE_Project;

+0

这个确实运行但是不会返回下面的目录标准零件 - P2,P3,P4。关闭但不完全在那里。 – CodeWriter