2017-04-10 6 views
-1

Ich möchte nur die unterste Ebene des CTE auswählen/anzeigen. Bitte helfen Sie. Ich verwende SQL Server 2016.SQL Server CTE: So wählen Sie nur die niedrigste Ebene

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) 

Ich muss nur Datensätze 3, 4, 6 anzeigen, die die niedrigste Ebene ist.

Update: Ich habe bereits die Abfrage erstellt, aber Datensatznummer 4 wurde nicht angezeigt. Ich erwarte, dass Datensatz Nummer 4 angezeigt wird, da der Datensatz die niedrigste Ebene in der Gruppe ist.

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

Würden Sie in Ihrer Abfrage/CTE bearbeiten, sowie Eingabedaten und erwartete Ergebnisse, damit die Leute das ein bisschen besser verstehen können? Ich bin mir nicht sicher, dass es klar ist, was Sie im Moment meinen. Wenn Sie zusätzlich eine SQL-Fiddle bereitstellen können, die am hilfreichsten wäre. – halfer

Antwort

0

Es hat nichts mit CTE zu tun. Verwenden Sie einfach LEFT OUTER JOIN mit IS NULL überprüfen.

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

Schön, es funktioniert. Danke :) –