0

このテーブルを考えると:

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
4

2 に答える 2

2

この他のスタック オーバーフローの質問を参照してください: 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;
于 2013-04-05T20:14:36.233 に答える