8
votes

SQL Hiérarchyid Comment puis-je obtenir les derniers descendants?

Utilisation t-sql code> Hiérarchie ID Comment puis-je obtenir toutes les lignes qui n'ont aucun enfant (c'est-à-dire les derniers accords)?

Say que ma table est structurée comme ceci: p>

1, Craig, /
2, Steve, /1/
3, John, /1/1/

4, Sam, /2/
5, Matt, /2/1/
6, Chris, /2/1/1/


0 commentaires

3 Réponses :


1
votes

Étant donné que vous n'avez besoin que de feuilles et que vous n'avez pas besoin de les obtenir d'un ancêtre spécifique, une simple requête non récursive comme celle-ci devrait faire le travail: xxx

en anglais clair: Sélectionnez chaque rangée sans ligne d'enfant.

Ceci suppose que votre hierarchyid est une clé étrangère vers le ID , pas le tout "chemin" tel que présenté dans votre exemple. Si ce n'est pas le cas, c'est probablement la première chose à suivre dans votre modèle de base de données.

--- Modifier ---

OK, Voici la requête spécifique à SQL Server MS SQL qui fonctionne réellement: xxx

Notez que le isdescendantof considère toute ligne un descendant d'elle-même, donc nous aussi besoin du enfant.id <> parent.id dans la condition.


4 commentaires

Je suis assez certain que l'OP utilise le type de données hierarchyid de SQL Server 2008, ce qui explique la représentation inhabituelle (voir msdn.microsoft.com/en-us/magazine/cc794278.aspx ).


@Danielpratt ahh ... Je vois maintenant la question a été ré-marquée comme [SQL-Server].


Merci d'avoir répondu branko, mais dans mon exemple, le champ ID est un entier et le hiérarchyide est un hiérarchyide SQL afin qu'ils ne puissent pas être comparés. Vous dites que je dois changer la clé de la table pour être le hiérarchyide?


@ERIFNEIFERT Je suppose que vous utilisiez une conception "classique" pour représenter les données hiérarchiques dans des bases de données relationnelles et non le mécanisme spécifique à SQL Server MS SQL. Malheureusement, je ne suis pas assez familier avec le mécanisme spécifique MS SQL Server pour recommander si vous devez réellement faire un commutateur, mais il semble que la même idée de base puisse être utilisée sur MS SQL Server. Voir le La réponse de Bannister .



14
votes

Peut-être qu'il y a de meilleures façons, mais ces coutures doivent faire le travail.

declare @T table
(
  ID int,
  Name varchar(10),
  HID HierarchyID
)

insert into @T values
(1, 'Craig', '/'),
(2, 'Steve', '/1/'),
(3, 'John', '/1/1/'),
(4, 'Sam', '/2/'),
(5, 'Matt', '/2/1/'),
(6, 'Chris', '/2/1/2/') -- HID for this row is changed compared to above query

select *
from @T
where HID not in (select HID.GetAncestor(1)
                  from @T
                  where HID.GetAncestor(1) is not null)


0 commentaires

1
votes

salut j'utilise celui-ci et fonctionne parfaitement pour moi. XXX


0 commentaires