Reputation: 9463
Given this table:
CREATE TABLE Employee
(
EmpId INT PRIMARY KEY IDENTITY,
EmpName VARCHAR(100) NOT NULL,
Position HierarchyID NOT NULL
)
INSERT INTO Employee (EmpName, Position)
VALUES ('CEO', '/'),
('COO', '/1/'),
('CIO', '/2/'),
('CFO', '/3/'),
('VP Financing', '/3/1/'),
('Accounts Receivable', '/3/1/1/'),
('Accountant 1', '/3/1/1/1/'),
('Accountant 2', '/3/1/1/2/'),
('Accountant 3', '/3/1/1/3/'),
('Accounts Payable', '/3/1/2/'),
('Accountant 4', '/3/1/2/1/'),
('Accountant 5', '/3/1/2/2/'),
('DBA', '/2/1/'),
('VP of Operations', '/1/1/')
How do I find all the rows that don't have any child nodes?
I have the following that seems to work, but it seems like there should be a less convoluted way:
select * from (
select
*,
case
when (select top 1 e.Position from dbo.Employee e where Position.GetAncestor(1) = Employee.Position) is null then
cast (0 as bit)
else
cast (1 as bit)
end as HasDescendants
from
dbo.Employee
) as managers
where HasDescendants = 0
Upvotes: 0
Views: 1782
Reputation: 9724
Query:
SELECT e.*
FROM dbo.Employee e
WHERE NOT EXISTS (SELECT 0
FROM Employee e2
WHERE e2.Position.ToString() like e.Position.ToString() + '_%')
Result:
| EMPID | EMPNAME | POSITION |
------------------------------------------
| 7 | Accountant 1 | 122,-42,-80 |
| 8 | Accountant 2 | 122,-42,-48 |
| 9 | Accountant 3 | 122,-42,-16 |
| 11 | Accountant 4 | 122,-38,-80 |
| 12 | Accountant 5 | 122,-38,-48 |
| 13 | DBA | 106,-64 |
| 14 | VP of Operations | 90,-64 |
Upvotes: 1
Reputation: 3145
See this other stack overflow question: Find all leaf node records using hierarchyid
SELECT A.*
FROM Employee AS A
LEFT OUTER JOIN Employee AS B
ON A.Position = B.Position.GetAncestor(1)
WHERE B.Position IS NULL;
Upvotes: 2