使用SQL层次结构语法

时间:2015-06-28 22:52:09

标签: sql sql-server sql-server-2008

我的表有3列 - OriginalDoc,ChildDoc和Fee。对于每个家长,根据他们的孩子或大孩子的数量 - 家长将被收取费用。

每份Child Doc收费为0.40美元

从以下示例中,

DocId : AB12456 has one Child Doc and so Fee is $0.40
Doc Id : CY12345 has 7 Children/GrandChildren Doc and so Fee is $2.80

NX23410和NY23422等文档无法向其收取费用。因为他们的父文件#CY12345是针对所有孩子/大孩子的。

DECLARE @Sample TABLE ( OriginalDoc VARCHAR(255), ChildDoc VARCHAR(255), Fee MONEY );

INSERT INTO @Sample
VALUES  ( 'AB12456', 'NX12450', NULL ),
    ( 'CY12345', 'NX23410', NULL ),             
    ( 'CY12345', 'NX23421', NULL ),             
    ( 'CY12345', 'NX23432', NULL ),             
    ( 'NX23410', 'NY23411', NULL ),             
    ( 'NX23410', 'NY23422', NULL ),             
    ( 'NY23422', 'NZ23411', NULL ),             
    ( 'NY23422', 'NZ23422',NULL);

如何在没有硬编码任何文档ID的情况下编写层次结构SQL查询?我们将输入参数作为DocId传递。

1 个答案:

答案 0 :(得分:3)

以下是如何执行此操作的方法:

with cte as(select *, OriginalDoc as Parent from Sample s1 
            where not exists(select * from Sample s2 where s2.ChildDoc = s1.OriginalDoc)

            union all

            select s.*, c.Parent from cte c
            join Sample s on c.ChildDoc = s.OriginalDoc
           )

select Parent, count(*)*0.4 as Fee from cte
group by Parent

小提琴http://sqlfiddle.com/#!3/f61ef/5