Рекурсивный запрос на получение детей и внуков - PullRequest
2 голосов
/ 06 июля 2011

У меня есть одна таблица сопоставления:

Code     Parent_code   Position
--------------------------------
H1       Null          Root
H11      H1            Parent
H111     H11           Parent
H1111    H111          Leaf
H1112    H111          Leaf 

Еще одна таблица, в которой хранится сумма для кода уровня листа

Code   Amount
-------------
H1111  100
H1112  200

, т.е. сумма хранится только в листовой позиции

Я хочу написать запрос, с помощью которого данные на уровне листа будут свернуты к его родителям и, в конечном счете, к его корню.

Вывод будет выглядеть следующим образом

Code   Amount
-------------
H1     300
H11    300
H111   300
H1111  100
H1112  200

Также, если явыберите H1, который является root, тогда выходные данные должны быть его дочерними элементами и его внуками.То же самое, если я выберу H11, я получу вывод как H111 И потомки H111

Ответы [ 2 ]

1 голос
/ 06 июля 2011

рекурсивное общее табличное выражение должно быть в состоянии предоставить вам необходимые данные. Хороший вопрос / ответ на этом сайте: здесь .

Вот пример, который может вам помочь:

create table #Code
(
Code varchar(20),
Parent_Code varchar(20)
)
go
insert into #Code (Code, Parent_Code)
select 'H1', null
union
select 'H11', 'H1'
union
select 'H111', 'H11'
union
select 'H1111', 'H111'
union
select 'H1112', 'H111'
union
select 'H12', 'H1'
union
select 'H121', 'H12'
go
create table #CodeAmount
(
Code varchar(20),
Amount decimal
)
go
insert into #CodeAmount (Code, Amount)
select 'H1111', 100
union
select 'H1112', 200
union
select 'H121', 50

go

with CodeAmountRollup(Code, Parent_Code, Amount)
as
(
    select c.Code, c.Parent_Code, ISNULL(ca.Amount, 0) as Amount from #Code c inner join #CodeAmount ca on c.Code = ca.Code
    union all
    select c.Code, c.Parent_Code, Amount as Amount from #Code c inner join CodeAmountRollup car on c.Code = car.Parent_Code     
)
--select * from CodeAmountRollup
select Code, sum(Amount) as Amount from CodeAmountRollup group by Code
0 голосов
/ 06 июля 2011

Ниже приведен пример некоторого SQL, который я недавно написал для аналогичного сценария, где мне нужно вернуть всех лицензиатов и упорядочить их по уровню лицензиата.Надеюсь, что это может объяснить концепцию.

WITH LicenseeEntity (iLicenseeId, vcLicenseeName, vcTradingName,iLicenseeType,iLicenseeStatus, iOwnerLicenseeId, Level)
    AS
    (
        -- Anchor Licensee definition
        SELECT l.iLicenseeId, l.vcLicenseeName, 
               l.vcTradingName,l.iLicenseeType,l.iLicenseeStatus, 
               l.iOwnerLicenseeId, 1 AS Level
        FROM Licensee (nolock) AS l
        WHERE iOwnerLicenseeId IS NULL

        UNION ALL
        SELECT l.iLicenseeId, l.vcLicenseeName, 
               l.vcTradingName,l.iLicenseeType,l.iLicenseeStatus, 
               l.iOwnerLicenseeId, 1 AS Level + 1
        FROM Licensee (nolock) AS l
        INNER JOIN LicenseeEntity AS le ON l.iOwnerLicenseeId = le.iLicenseeId
    )

    SELECT *  FROM LicenseeEntity le 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...