繁体   English   中英

按查找顺序递归查询排序

[英]Recursive Query ordering by find order

我正在构建一个查询,其中我需要按查询找到值的顺序返回结果。

这是查询

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是第一行的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

让我们添加一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM