Рекурсивный запрос по порядку поиска - PullRequest
3 голосов
/ 09 мая 2019

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

ЗДЕСЬ ЗАПРОС

DECLARE @Query TABLE
(
    [ParentID] VARCHAR(50) NULL,
    [ChildID] VARCHAR(50) NOT NULL,
    [Action] VARCHAR(max) NOT NULL
);

WITH q
AS
(
    SELECT DISTINCT M1.[ParentID], M1.[ChildID], M1.[Action]
    FROM [dbo].[xNodes] M1
        LEFT JOIN [dbo].[xNodes] M2 ON M1.[ParentID] = M2.[ChildID]
    WHERE M1.[ChildID] = 'PCMN014'
    UNION ALL
    SELECT M.[ParentID], M.[ChildID], M.[Action]
    FROM q
        INNER JOIN [dbo].[xNodes] M ON q.[ParentID] = M.[ChildID]
)
INSERT INTO @Query ([ParentID], [ChildID], [Action])
SELECT DISTINCT * FROM q;

SELECT DISTINCT * FROM @Query

SELECT * FROM @Query q WHERE [ParentID] IS NULL UNION ALL 
SELECT * FROM @Query q WHERE [ParentID] = 'IDS' UNION ALL 
SELECT * FROM @Query q WHERE [ParentID] = 'EFL' UNION ALL 
SELECT * FROM @Query q WHERE [ParentID] = 'PEFL001' UNION ALL 
SELECT * FROM @Query q WHERE [ParentID] = 'PCMN010'

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

***ParentID, ChildID, Action***
NULL,       IDS,        Launch IDS
EFL,        PEFL001,    [Click] Case Management > Case Review Workbasket
IDS,        EFL,        Log into IDS
PCMN010,    PCMN014,    [Click] Title Search arrow beside Title
PEFL001,    PCMN010,    [Click] User Search arrow beside User ID
PEFL001,    PCMN010,    [Click] User Search arrow under File Location - Person

Ниже я ожидаю следующего.Обратите внимание, что ParentID 2-й строки - это ChildID первой строки и т. Д.

***ParentID, ChildID, Action***
NULL,       IDS,        Launch IDS
IDS,        EFL,        Log into IDS
EFL,        PEFL001,    [Click] Case Management > Case Review Workbasket
PEFL001,    PCMN010,    [Click] User Search arrow beside User ID
PEFL001,    PCMN010,    [Click] User Search arrow under File Location - Person
PCMN010,    PCMN014,    [Click] Title Search arrow beside Title

1 Ответ

0 голосов
/ 10 мая 2019

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

DECLARE @Query TABLE
(
    [ParentID] VARCHAR(50) NULL,
    [ChildID] VARCHAR(50) NOT NULL,
    [Action] VARCHAR(max) NOT NULL,
    [Seq] int
);

WITH q
AS
(
    SELECT DISTINCT M1.[ParentID], M1.[ChildID], M1.[Action],1 [Seq]
    FROM [dbo].[xNodes] M1
        LEFT JOIN [dbo].[xNodes] M2 ON M1.[ParentID] = M2.[ChildID]
    WHERE M1.[ChildID] = 'PCMN014'
    UNION ALL
    SELECT M.[ParentID], M.[ChildID], M.[Action],q.[Seq]+1 [Seq]
    FROM q
        INNER JOIN [dbo].[xNodes] M ON q.[ParentID] = M.[ChildID]
)
INSERT INTO @Query ([ParentID], [ChildID], [Action],[Seq])
SELECT DISTINCT * FROM q 

SELECT [ParentID], [ChildID], [Action] FROM @Query order by [Seq] desc

Вывод будет: -

ParentID    ChildID            Action
========    =======            =====
NULL        IDS                Launch IDS
IDS         EFL                Log into IDS
EFL         PEFL001            [Click] Case Management > Case Review Workbasket
PEFL001     PCMN010            [Click] User Search arrow beside User ID
PEFL001     PCMN010            [Click] User Search arrow under File Location - Person
PCMN010     PCMN014            [Click] Title Search arrow beside Title
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...