SQL-запрос, исследующий граф с несколькими родителями - PullRequest
0 голосов
/ 16 октября 2018

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

ДЕМО СТРУКТУРА И ДАННЫЕ

If object_id('dbo.TST_COMPONENT') is not null
DROP table TST_COMPONENT

CREATE TABLE TST_COMPONENT (
    [MAT_CODE] VARCHAR(max)
    , [SPEC_CODE] VARCHAR(max)
    , [COMP_MAT_CODE] VARCHAR(max)
    , [COMP_SPEC_CODE] VARCHAR(max)
    );

INSERT INTO TST_COMPONENT (
    [MAT_CODE], [SPEC_CODE], [COMP_MAT_CODE], [COMP_SPEC_CODE]
    )
VALUES
    ('M1', NULL, 'M2', NULL),
    ('M1', NULL, 'M4', NULL),
    ('M2', NULL, NULL, 'S3'),
    ('M2', NULL, 'M6', NULL),
    (NULL, 'S3', 'M5', NULL),
    ('M4', NULL, NULL, 'S4'),
    ('M5', NULL, NULL, NULL),
    ('M6', NULL, NULL, NULL),
    (NULL, 'S4', NULL, 'S5'),
    (NULL, 'S5', 'M7', NULL),
    ('M7', NULL, NULL, NULL);

В этом случае M1 имеет M2 и M4 в качестве детей, M2 имеет M6 и S3, а S3 имеет M5.В другой ветви M4 переходит к S4, затем к S6 и, наконец, к M7.

Какой самый быстрый способ исследовать это дерево с помощью SQL-запроса?Еще лучше это работает для Oracle и SQL Server.

1 Ответ

0 голосов
/ 16 октября 2018

Я пытался добиться чего-то подобного

WITH MyCTE
AS ( SELECT MAT_CODE, SPEC_CODE, COMP_MAT_CODE, COMP_SPEC_CODE
FROM TST_COMPONENT
WHERE MAT_CODE = 'M1'
UNION ALL
SELECT C.MAT_CODE, C.SPEC_CODE, C.COMP_MAT_CODE, C.COMP_SPEC_CODE
FROM TST_COMPONENT C
    INNER JOIN MyCTE ON
    (
        ( C.MAT_CODE = MyCTE.COMP_MAT_CODE AND C.SPEC_CODE IS NULL)
        OR
        ( C.SPEC_CODE = MyCTE.COMP_SPEC_CODE AND C.MAT_CODE IS NULL)
    )
    --WHERE C.MAT_CODE = MyCTE.COMP_MAT_CODE AND C.SPEC_CODE = MyCTE.COMP_SPEC_CODE
)
SELECT * FROM MyCTE

Кажется, что оно покрывает мое требование, только я не уверен, является ли оно лучшим и действительно ли оно охватывает все возможные случаи.

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