Работа с синтаксисом иерархии SQL

В моей таблице 3 столбца: OriginalDoc, ChildDoc и Fee. За каждого родителя в зависимости от количества детей или внуков взимается плата.

Стоимость каждого детского документа составляет 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);

Как написать иерархический SQL-запрос без жесткого кодирования идентификаторов документов? Мы будем передавать входной параметр как DocId.


person goofyui    schedule 28.06.2015    source источник
comment
Я думаю, вы ищете рекурсивный CTE. Посмотрите простой пример по этой ссылке.   -  person Jeremy Fortune    schedule 29.06.2015
comment
Спасибо, я пытаюсь использовать эти образцы запросов. Я считаю, что нам нужен синтаксис иерархии.   -  person goofyui    schedule 29.06.2015
comment
Да, я собирался спросить об этом раньше, но вам нужно будет дать мне ссылку или что-то еще, чтобы описать, что такое синтаксис иерархии. Самое близкое, что я нашел, это это, что является просто более длинной формой ссылки CTE, которую я дал ранее.   -  person Jeremy Fortune    schedule 29.06.2015
comment
Было бы полезно, если бы вы объяснили результат, который вы ищете в результате этого запроса? то есть, если вы передаете идентификатор документа: CY12345, вывод будет .....   -  person Charles    schedule 29.06.2015
comment
Фиксируется ли иерархия на 3-х уровнях (родительский, дочерний, внучатый) или она может быть любой глубины? Если какая-то глубина, применяется ли плата ко всем уровням?   -  person Damien_The_Unbeliever    schedule 29.06.2015


Ответы (1)


Вот как вы можете это сделать:

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

person Giorgi Nakeuri    schedule 29.06.2015
comment
Отлично, спасибо .!! Синтаксиса иерархии нет..!! - person goofyui; 29.06.2015