2017-04-10 28 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

不错,它的工作。谢谢 :) –