Как связать нижнее значение в иерархии с каждым уровнем над ним? - PullRequest
0 голосов
/ 24 апреля 2020

Я работаю с SQL серверной базой данных, и у меня есть следующие две таблицы:

Nested Apps                                        Nested App Groups
|---------------------|------------------|         |---------------------|------------------|
|       App_Group     |        App       |         |       App_Group     | Child_App_Group  |
|---------------------|------------------|         |---------------------|------------------|
|          5          |         A        |         |          1          |         4        |
|---------------------|------------------|         |---------------------|------------------|
|          7          |         B        |         |          4          |         5        |
|---------------------|------------------|         |---------------------|------------------|
|          9          |         C        |         |          2          |         6        |
|---------------------|------------------|         |---------------------|------------------|
                                                   |          6          |         7        |
                                                   |---------------------|------------------|
                                                   |          3          |         8        |
                                                   |---------------------|------------------|
                                                   |          8          |         9        |
                                                   |---------------------|------------------|

Слева мы видим отношение родитель / потомок между группами приложений и приложениями. Справа мы видим отношение родитель / потомок между группами приложений и группами приложений (у приложений не может быть детей). В этом примере приложение A является дочерним по отношению к группе приложений 5, которая является дочерним по отношению к группе приложений 4, которая затем является дочерней по отношению к группе приложений 1.

Что мне нужно, так это таблица, в которой показан вложенный родительский элемент / Дочерние отношения групп приложений и приложений, независимо от того, является ли приложение прямым потомком или «внуком», и т. д. c ... Примерно так:

|---------------------|------------------|
|       App_Group     |        App       |
|---------------------|------------------|
|          1          |         A        |
|---------------------|------------------|
|          4          |         A        |
|---------------------|------------------|
|          5          |         A        |
|---------------------|------------------|
|          2          |         B        |
|---------------------|------------------|
|          6          |         B        |
|---------------------|------------------|
|          7          |         B        |
|---------------------|------------------|
|          3          |         C        |
|---------------------|------------------|
|          8          |         C        |
|---------------------|------------------|
|          9          |         C        |
|---------------------|------------------|

Я на самом деле не приблизился к решая это. Я пытался работать с идеей, что мне как-то нужно пройти через иерархию, что было бы немного проще, если бы у меня было одно приложение за раз. Но здесь я должен сделать это с 3 приложениями одновременно. Я понятия не имею, как начать .. Кто-нибудь?

ОБНОВЛЕНИЕ:

Я очень близко подошел к чему-то вроде этого:

WITH cte AS ( SELECT app_group_id, app_id FROM nested_apps UNION ALL SELECT 
nag.app_group_id, c.app_id FROM nested_app_groups nag JOIN cte c ON 
nag.child_app_group_id = c.app_group_id ) SELECT app_group_id, app_id FROM 
cte

1 Ответ

0 голосов
/ 24 апреля 2020

Привет, я думаю, что вы можете создать запрос, используя CTE (рекурсивно и используя временную таблицу), например:

Ресурс: CTE Microsoft: https://docs.microsoft.com/fr-fr/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15 Ссылка: https://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/

create Table #APPS
(
    App_Group varchar(128),
    App varchar(128)
)

Insert into #APPS
(
    App_Group,
    App
)

SELECT '5', 'A'
UNION ALL 
SELECT '7','B'
UNION ALL 
SELECT '9','C'

create Table #APPS_GROUPS
(
    App_Group varchar(128),
    Child_App_Group varchar(128)
)

Insert into #APPS_GROUPS
(
    App_Group,
    Child_App_Group 
)

SELECT '1', '4'
UNION ALL 
SELECT '4','5'
UNION ALL 
SELECT '2','6'
UNION ALL 
SELECT '6','7'
UNION ALL 
SELECT '3','8'
UNION ALL 
SELECT '8','9'



SELECT *
INTO #MYAPPS
FROM (
    SELECT AG.App_Group, AG.Child_App_Group, '' AS 'App'
    FROM #APPS_GROUPS AG
    UNION ALL 
    SELECT A.App_Group, '' AS 'Child_App_Group', App AS 'App'
    FROM #APPS A
) SUBQUERY
ORDER BY App;

WITH MyCteAPP AS (
    SELECT App_Group, Child_App_Group, App
    FROM #MYAPPS
    WHERE Child_App_Group = ''
    UNION ALL 
    SELECT MYAPP.App_Group, MYAPP.Child_App_Group, FAPP.App
    FROM #MYAPPS MYAPP
    JOIN MyCteAPP FAPP ON MYAPP.Child_App_Group = FAPP.App_Group
    WHERE MYAPP.Child_App_Group <> ''
)
SELECT App_Group, App
FROM MyCteAPP
ORDER BY App

DROP TABLE  #APPS
DROP TABLE  #APPS_GROUPS
DROP TABLE #MYAPPS
...