Quizás haya mejores formas pero esto parece ser suficiente para hacer el trabajo.
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/1/')
select *
from @T
where HID.GetDescendant(null, null) not in (select HID
from @T)
Resultado:
ID Name HID
----------- ---------- ---------------------
3 John 0x5AC0
6 Chris 0x6AD6
actualización 2012-05-22
consulta anterior fallará si números de nodo no está en una secuencia ininterrumpida. Aquí hay otra versión que debería encargarse de eso.
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)
Estoy bastante seguro de que el OP está utilizando el 'HierarchyID' tipo de datos de SQL Server 2008, lo que explica la representación inusual (ver http://msdn.microsoft.com/en-us/magazine/cc794278 .aspx). –
@DanielPratt Ahh ... Veo ahora que la pregunta se volvió a etiquetar como [sql-server]. –
Gracias por responder a Branko, pero en mi ejemplo, el campo Id es un número entero y el HierarchyId es un sql HierarchyId por lo que no se pueden comparar. ¿Estás diciendo que necesito cambiar la clave de la tabla para que sea el hierarchyId? – Eric