2017-04-10 11 views
-1

CTEの最低レベルを選択/表示します。助けてください。私はSQL Server 2016を使用しています。SQL Server CTE:最低レベルのみを選択する方法

Create Table Location 
(
    Id int 
    Name varchar(20) 
    Parent int 
) 

Insert into location 
values (1, Location1, null), (2, Location1child, 1), 
     (3, Location1grandchild, 2), (4, Location2, null), 
     (5, Location3, null), (6, Locationchild3, 5) 

最低レベルのレコード3,4,6を表示する必要があります。

更新:すでにクエリを作成しましたが、レコード番号4は表示されませんでした。レコードがグループの最下位レベルであるため、レコード番号4が表示されることを期待しています。

With CTE (id, cte_level, cte_name, cte_longname) as 
(
    Select 
     A.ID, 1, 
     cast(A.name as varchar(max)), 
     cast(A.name as varchar(max)) 
    from 
     Location A 

    Union All 

    Select 
     A.ID, cte_level + 1, 
     replicate(' · ' , cte_level) + cast(A.name as varchar(max)), 
     cte.cte_longname + ' . ' + cast(A.name as varchar(max)) 
    from 
     Location A 
    inner join 
     CTE ON A.Parent = CTE.id 
) 
select 
    CTE_2.id, 
    CTE_2.cte_longname [name] 
    --, A.cte_name [name]   
    from 
     CTE as CTE_1 
inner join 
    CTE as CTE_2 on CTE_1.id = cte_2.id 
where 
    CTE_1.cte_level = 1 
    And CTE_2.cte_level = (Select MAX(CTE.cte_level) From CTE) 
order by 
    cte_2.cte_longname 
+0

あなたのクエリ/ CTEに加えて、データと予想される結果を編集して、人々がこれを少し良く理解できるようにしますか?私はあなたが現在意味することがはっきりしているかどうかはわかりません。もしあなたがさらに役に立つSQLフィドルを提供できれば。 – halfer

答えて

0

CTEとは関係ありません。ちょうどLEFT OUTER JOINIS NULLのチェックを付けてください。

SELECT P.* 
FROM Location P 
LEFT OUTER JOIN Location C ON P.Id = C.Parent 
WHERE C.Id IS NULL; 
+0

ニース、それは働いています。ありがとうございました :) –

関連する問題