2017-02-15 4 views
2

Ich habe Tabelle mit wenigen Spalten & ich einen CTE bin mit Daten in einer hierarchischen Ordnung in sortierter Weise zu erhalten:SQL Server CTE-Abfrage nicht gewünschtes Ergebnis bekommt

Cat 1 
--item X1 
--item X2 
Cat 2 
Cat 3 
Cat 4 
cat 5 
--item A1 
--item A2 
Cat 6 

Tabellendaten:

ID LanguageID Name  ParentID Active 
---------------------------------------------- 
1 1   Cat 1  0   1 
2 1   item X1  1   1 
3 1   item X2  1   1 
4 1   cat 2  0   1 
5 1   cat 3  0   0 
6 1   cat 4  0   1 
7 1   cat 5  0   1 
8 1   item A1  7   1 
9 1   item A2  7   0 
10 1   cat 6  0   1 

CTE query:

WITH CTE (ID, ParentID, Name, LanguageID, Active, Depth, SortCol) AS 
( 
    SELECT 
     ID, ParentID, Name, LanguageID, Active, 0, 
     CAST(ID AS varbinary(max)) 
    FROM 
     Project 
    WHERE 
     ParentID = 0 AND Active = 1 

    UNION ALL 

    SELECT 
     d.ID, d.ParentID, d.Name, p.LanguageID, p.Active, p.Depth + 1, 
     CAST(SortCol + CAST(d.ID AS binary(4)) AS varbinary(max)) 
    FROM 
     Project AS d 
    JOIN 
     CTE AS p ON d.ParentID = p.ID 
    WHERE 
     p.Active = 1 
) 
SELECT 
    ID, ParentID, Name, LanguageID, Active, Depth, 
    REPLICATE('  ', Depth) + Name as HName 
FROM 
    CTE 
WHERE 
    LanguageID = 1 AND Active = 1 
ORDER BY 
    Name 

Above Abfrage versteckt die übergeordnete Kategorie, aber nicht die untergeordneten Elemente.

Zweite Ich bin nur in der Lage, Elternkategorie im Namen, aber nicht die Kind Artikel zu bestellen.

sollte voraussichtlich ausgegeben werden:

Cat 1 
--item X1 
--item X2 
Cat 2 
Cat 4 
cat 5 
--item A1 
Cat 6 

UPDATE: Just zu erwähnen ich die alle Spalten der CTE-Abfrage unten in oben Ausgabe zeige, ist die vollständige Ausgabe der Abfrage

ID ParentID Name  LanguageID Active Depth HName 
------------------------------------------------------------------ 
1  0  Cat 1   1   1  0 Cat 1 
4  1  item X1   1   1  0 item X1 
7  1  item X2   1   1  0 item X2 
8  0  cat 2   1   1  1 cat 2 
9  0  cat 4   1   1  1 cat 4 
10  0  cat 5   1   1  0 cat 5 
3  7  item A1   1   1  1 item A1 
2  7  item A2   1   1  1 item A2 
6  0  cat 6   1   1  0 cat 6 
+2

Um den 'Artikel A2' Aufzeichnung Sie müssen herausfiltern verwenden WHERE d.Active = 1 'statt' WHERE p.Active = 1' – cha

+0

Dank, ich weiß, ich machte einige Fehler, den ich nicht sehen konnte. Danke, dass du es aufgezeigt hast. Bitte sagen Sie es ist eine Antwort, so dass ich es akzeptieren kann – Learning

Antwort

0

Sie kann Self-Join hier verwenden. siehe untenstehende Abfrage

select p.Name, c.Name,c.Active,c.Id,c.LanguageID 
From Project c left outer join Project p 
where c.ParentId = p.Id 
Verwandte Themen