Utilisation Say que ma table est structurée comme ceci: p> t-sql code> Hiérarchie ID Comment puis-je obtenir toutes les lignes qui n'ont aucun enfant (c'est-à-dire les derniers accords)? 1, Craig, /
2, Steve, /1/
3, John, /1/1/
4, Sam, /2/
5, Matt, /2/1/
6, Chris, /2/1/1/
3 Réponses :
É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: en anglais clair: Sélectionnez chaque rangée sans ligne d'enfant. p> Ceci suppose que votre --- Modifier --- Strong> OK, Voici la requête spécifique à SQL Server MS SQL qui fonctionne réellement: p> Notez que le hierarchyid code> est une clé étrangère vers le ID code>, 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. P> isdescendantof code> considère toute ligne un descendant d'elle-même, donc nous aussi besoin du enfant.id <> parent.id code> dans la condition. p> p>
Je suis assez certain que l'OP utilise le type de données hierarchyid code> 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
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)
salut j'utilise celui-ci et fonctionne parfaitement pour moi.