2016-06-28 20 views
1

私は3つのSQL Serverテーブルを持っています:ProjectsProjectTreeProjectTreeRecです。SQL ServerのSelectステートメントの再帰

Projectsはディレクトリと似ており、Standard Partsというディレクトリの下にあるすべてのサブディレクトリを検索しようとしています。ここで明らかに再帰が必要です。

Projectsテーブルには、次の列があります。

ProjectID, Name, Deleted 

ProjectTreeテーブルには、次のカラムがあります

ProjectID, ChildProject 

私はこの取り組みの一環としてProjectTreeRecテーブルを必要とは思いません、列にはChildProjectID,ParentProjectID,Levelが含まれています。

Standard Partsディレクトリの下のすべてのサブディレクトリが削除されていない(1ではなく0である)再帰的なselect文を開発したいと考えています。

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 Serverを使用していますか? –

+0

再帰的CTEを確認できます:http://stackoverflow.com/questions/37973842/get-all-duplicate-data-by-parent-or-child-id-sql-server/37975448#37975448 –

+0

私は使用しています[パス]は FROM ( が を選択すると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

関連する問題