Có lẽ có những cách tốt hơn nhưng đường nối này để thực hiện công việc.
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)
Kết quả:
ID Name HID
----------- ---------- ---------------------
3 John 0x5AC0
6 Chris 0x6AD6
Cập nhật 2012-05-22
Query trên sẽ thất bại nếu số nút không phải là trong một chuỗi không gián đoạn. Đây là một phiên bản khác nên chú ý đến điều đó.
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)
Tôi khá chắc chắn OP đang sử dụng 'kiểu dữ liệu HierarchyID' của SQL Server 2008, điều này giải thích các đại diện khác thường (xem http://msdn.microsoft.com/en-us/magazine/cc794278 .aspx). –
@DanielPratt Ahh ... Tôi thấy bây giờ câu hỏi đã được gắn lại là [sql-server]. –
Cảm ơn bạn đã phản hồi Branko, nhưng trong ví dụ của tôi trường Id là một số nguyên và HierarchyId là một phân cấp sql để chúng không thể so sánh được. Bạn có nói rằng tôi cần phải thay đổi chìa khóa của bảng để được các hierarchyId? – Eric