Holen Sie sich direkt Nachkommen zählen mit HierarchieId

SQL server 2008 mit hierarchyId

Angesichts dieser Struktur:

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

Ich kann die folgende Unterabfrage ausführen, um eine Zählung für jeden Knoten direkte Nachkommen zählen, aber es ist nicht sehr effizient.

 select *, (select count(*) from dbo.Employee e where Position.GetAncestor(1) = Employee.Position) as DirectDescendantsCount from dbo.Employee 

Ergebnisse:

 EmpId | EmpName | Position | DirectDescendantsCount 1 CEO 0x 3 2 COO 0x58 1 3 CIO 0x68 1 4 CFO 0x78 1 5 VP Financing 0x7AC0 2 6 Accounts Receivable 0x7AD6 3 7 Accountant 1 0x7AD6B0 0 8 Accountant 2 0x7AD6D0 0 9 Accountant 3 0x7AD6F0 0 10 Accounts Payable 0x7ADA 2 11 Accountant 4 0x7ADAB0 0 12 Accountant 5 0x7ADAD0 0 13 DBA 0x6AC0 0 14 VP of Operations 0x5AC0 0 

Was ist eine effizientere Abfrage für diese Art von Operation auf hierarchyid ?

Danke für jede Hilfe!

Sie können die Unterabfrage wie folgt beseitigen:

 SELECT A.EmpId, A.EmpName, A.Position, COUNT(B.EmpId) AS DirectDescendantsCount FROM Employee AS A LEFT OUTER JOIN Employee AS B ON A.Position = B.Position.GetAncestor(1) group by A.EmpId, a.EmpName, A.Position