Obtenir les descendants directs countnt avec HierarchyId

SQL Server 2008 w / hierarchyId

Compte tenu de cette structure:

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

Je peux exécuter la sous-requête suivante pour get un count pour le nombre de descendants directs de chaque nœud, mais ce n'est pas très efficace.

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

Résultats:

 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 

Quelle est une requête plus efficace pour ce type d'opération sur hierarchyid ?

Merci pour toute aide!

Vous pouvez éliminer la sous-requête comme ceci:

 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