2013-04-05 35 views
0

孩子的所有節點:查找有鑑於此表HIERARCHYID

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/') 

如何找到沒有任何子節點的所有行?

我有一個似乎工作以下,但似乎應該有一個不太令人費解的方式:

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 

回答

1

查詢:

SQLFIDDLEExample

SELECT e.* 
FROM dbo.Employee e 
WHERE NOT EXISTS (SELECT 0 
     FROM Employee e2 
     WHERE e2.Position.ToString() like e.Position.ToString() + '_%') 

結果:

| 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 |