Агрегирование итоговых потомков с использованием CTE MS SQL - PullRequest
0 голосов
/ 09 августа 2011

У меня есть очень простая таблица в базе данных Micrososft SQL 2008 R2, которая называется «Родословная», формы:

parentSearch childSearch
1195784 1185596
1195787 1185596
1195787 1195785
1195787 1195786
1195799 1185596
1185596 1195785
1195785 1195786
1195786 1195776
1195786 1195788
1195786 1195790
1195786 1195796
1195786 1195798
1195785 1195786
1195786 1195776
1195786 1195788
1195786 1195790
1195786 1195796
1195786 1195798
1195786 1195776
1195786 1195795 795 1195 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 795 или 795 795 795 795 795 1195 7 или 795* 1195786 1195798

Это таблица предков, с потомками глубиной не менее четырех уровней.Я ударил себя по лицу, пытаясь написать CTE против этого, который агрегирует общее количество потомков для КАЖДОГО родителя, независимо от уровня, на котором они находятся.У одного ребенка в этих данных может быть несколько родителей.

Ответы [ 2 ]

4 голосов
/ 09 августа 2011

Попробуйте это:

with temp as
(
SELECT 1195784 as Parent, 1185596 as Child
UNION
SELECT 1195787, 1185596
UNION
SELECT 1195787, 1195785
UNION
SELECT 1195787, 1195786
UNION
SELECT 1195799, 1185596
UNION
SELECT 1185596, 1195785
UNION
SELECT 1195785, 1195786
UNION
SELECT 1195786, 1195776
UNION
SELECT 1195786, 1195788
UNION
SELECT 1195786, 1195790
UNION
SELECT 1195786, 1195796
UNION
SELECT 1195786, 1195798
UNION
SELECT 1195785, 1195786
UNION
SELECT 1195786, 1195776
UNION
SELECT 1195786, 1195788
UNION
SELECT 1195786, 1195790
UNION
SELECT 1195786, 1195796
UNION
SELECT 1195786, 1195798
UNION
SELECT 1195786, 1195776
UNION
SELECT 1195786, 1195788
UNION
SELECT 1195786, 1195790
UNION
SELECT 1195786, 1195796
UNION
SELECT 1195786, 1195798
),
agg as
(
        SELECT  parent, child
        FROM    temp
        UNION ALL
        SELECT  t.parent, t.Child
        FROM    agg
        JOIN    temp t
        ON      agg.child = t.parent
)

SELECT parent, COUNT(*)
FROM agg
GROUP BY parent
0 голосов
/ 09 августа 2011

Попробуйте это:

WITH CTE AS
(
    SELECT *
    FROM Ancestry
    UNION ALL
    SELECT A.ParentSearch, B.ChildSearch
    FROM CTE A
    INNER JOIN Ancestry B
    ON A.ChildSearch = B.ParentSearch
)
SELECT ParentSearch, COUNT(*) Quant
FROM CTE
GROUP BY ParentSearch
ORDER BY ParentSearch
OPTION(MAXRECURSION 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...