2016-04-15 5 views
1

Ich habe die folgende Abfrage, um die übergeordneten Elemente und die (nur die ersten 2) Nachkommen zusammen mit der Anzahl der Kinder zurückgeben. Die Abfrage gibt jedoch nur mehr als 2 Nachkommen zurück (hier ist die SQL Fiddle: http://sqlfiddle.com/#!6/6489b/5).CTE Rekursion, um eine bestimmte Anzahl von Nachkommen pro Elternteil zu bekommen

Hier ist der Ausgang. Ich enthalten DescendentCount für die Prüfung:

EntryId Title ParentId Depth ChildCount DescendentCount 
15   a  NULL  0  5   1 
4   d  NULL  0  1   1 
1   c  NULL  0  7   1 
1   s  NULL  0  7   1 
22   a1  4   1  0   2 
24   da  15   1  0   2 
23   32  15   1  0   2 
16   b  15   1  2   2 
21   n  16   1  0   3 
20   y  16   1  0   3 

So wird der Eintrag mit ID: 16 sollte da ich P.DescendentCount < = 2, wo Bedingung verwendet aufgeführt werden. Ich sehe jedoch, dass DescendentCount die Art, wie ich dachte, nicht erhöht hat. Gibt es eine Möglichkeit, die Nachkommen zu begrenzen?

+0

Können Sie Daten zum Testen bereitstellen? – Stainy

+0

@Stainy Sie meinen echte Daten? Wie kann ich das machen? – renakre

+1

Möglicherweise möchten Sie ein [SQL Fiddle] (http://sqlfiddle.com/) mit Ihren Beispieldaten erstellen. –

Antwort

1

Sie müssen die DescendentCount erneut RANGE und machen Sie es <=2 (wie Sie nur die ersten beiden Abkömmlinge wollen) in WHERE Ursache. Ich habe Ihre Abfrage, die Sie in SQL Fiddle angegeben haben, geändert und in meinem SqlServer Management Studio ausgeführt. Folgende TSQL funktioniert einwandfrei:

;WITH cte AS (
SELECT [EntryId], 
     [Title], 
     [ParentId],   
     [Depth], 
     ROW_NUMBER() OVER (ORDER BY EntryId DESC) [Rn], 
     CAST(EntryId AS VARCHAR(MAX)) [Path], 
     1 AS DescendentCount 
FROM Entries 
WHERE [Depth] = 0 
UNION ALL 
SELECT e.[EntryId], 
     e.[Title], 
     e.[ParentId], 
     e.[Depth], 
     Rn, 
     [Path] + ',' + CAST(e.EntryId AS VARCHAR(MAX)), 
     c.DescendentCount + 1 
FROM Entries e 
     JOIN cte c ON c.EntryId = e.ParentId 
     WHERE e.Depth=1 AND c.DescendentCount <= 2 
) 

SELECT Raihan.[EntryId] 
    ,Raihan.[Title] 
    ,Raihan.[ParentId] 
    ,Raihan.[Depth] 
    ,Raihan.ChildCount 
    ,Raihan.DescendentCount 
    --,Raihan.NewRN 
    FROM 
(
SELECT [EntryId], 
    [Title], 
    [ParentId], 
    [Depth], 
    ChildCount, 
    DescendentCount, 
    ROW_NUMBER() OVER (PARTITION BY DescendentCount ORDER BY DescendentCount DESC) AS NewRN 
FROM cte c1 
    OUTER APPLY (SELECT COUNT (*) - 1 AS ChildCount 
       FROM cte c2 
       WHERE c2.[Path] LIKE c1.[Path] + '%' 
       ) oa 
) AS Raihan 
WHERE Raihan.NewRN<=2 
ORDER BY Raihan.[ParentId] 
Verwandte Themen