2

Je SQL Server 2008 avec une table appelée catégories de produit conçu comme ceci:SQL Server: Sélectionnez Parent-enfant

Id | Name  | ParentId 
71 PCs   NULL 
32 MACs  NULL 
3 Keyboard 1 
9 Mouse  1 
5 Screen  1 
11 Keyboard 2 
7 Mouse  2 
8 Screen  2 

je voudrais choisir de cette table, et d'obtenir un jeu de résultats comme ceci:

Id | Name  | ParentId 
71 PCs   NULL 
3 Keyboard 1 
9 Mouse  1 
5 Screen  1 
32 MACs  NULL 
11 Keyboard 2 
7 Mouse  2 
8 Screen  2 

J'ai essayé, mais cela me donne évidemment ceux sans ParentId premier:

WITH Hierarchy 
AS 
(
    SELECT 
     T1.Id, T1.ParentId 
    FROM 
     ProductCategories T1 
    WHERE 
     T1.parentid IS NULL OR 
     T1.parentid IN (SELECT id from ProductCategories WHERE parentid IS NULL) 
    UNION ALL 
    SELECT 
     T1.Id, T1.ParentId 
    FROM 
     ProductCategories T1 
    INNER JOIN 
     Hierarchy TH ON TH.Id = T1.ParentId 
) 
select * 
from Hierarchy 
order by parentid 

S'il vous plaît aidez-moi, si vous pouvez :)

- Le gars qui ne sait pas SQL

+0

Que (en anglais) essayez-vous de faire? Je ne peux pas désosser votre intention à partir de la sortie que vous avez incluse. Il y a un nombre infini de façons de générer cette sortie à partir des données, mais probablement très peu qui généreraient la "bonne" sortie (qui fait ce que vous voulez) d'un sdet de données différent ... –

+0

Comment votre jeu de résultats diffère à partir des données brutes dans la table, autre qu'un ordre de tri non documenté? – RedFilter

+0

Pour éclaircir ceci: cette table se réfère à elle-même? Oui, apparemment c'est le cas. –

Répondre

3

essayez ceci:

Select Id, Name, ParentId 
From ProductCategories 
Order By Coalesce(ParentId, Id), 
    Coalesce(ParentId, 0), Name 

Trois Trier par clauses,

  1. Coalesce (ParentId, Id): celui-ci regroupe les enregistrements par le parent, pour le parent lui-même et tous les enfants de ce parent
  2. Coalesce (ParentId, 0) Ce groupe se regroupe au sein de chaque ensemble de sorte que l'enregistrement avec un parent nul (le parent) trie vers le haut dans le groupe
  3. Nom, Th est trie les enfants dans le groupe par le nom
+0

Parfait. Exactement ce que je cherchais. – MartinHN

0

Essayez cette

SELECT id, name, parentId 
FROM categories 
ORDER BY ISNULL(parentId,id), id 

BTW, ne devrait pas deux premiers les index de votre table sont 1 et 2, pas 71 et 32?

+0

Non. Vous pouvez ajouter et supprimer des catégories, puis promouvoir une nouvelle catégorie dans une catégorie parente. Donc, ce serait le cas avec 71 et 32. – MartinHN

Questions connexes