【问题标题】:Recursive Query ordering by find order通过查找顺序递归查询排序
【发布时间】:2019-09-27 12:43:01
【问题描述】:

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

这里是查询

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

【问题讨论】:

  • 为什么您的最终选择不能简单地接受所有 ParentID,然后按 parentsID 排序并带有案例陈述优先。这将消除工会并控制排序。
  • 这会将它们组合在一起是的,但是它会与预期的顺序混淆,因为按 ParentID 排序是按字母顺序排列的
  • 我想你想要反过来,因为你是从子节点开始的。检查我的答案。
  • 对不起,我的意思不是常规的“按 ParentID 排序”,而是当 Parentid = 1 然后 2,当 parentid = 2 然后 1 等等时按大小写排序......”允许完全自定义排序
  • 我得出的结论是,我需要在 c# 中构建此解决方案,然后提供列表。谢谢大家

标签: sql sql-server tsql recursive-query


【解决方案1】:

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

【讨论】:

  • 抱歉,我已经考虑过了。问题是顺序可以如下。 1, 2, 5, 3 但也可以是 5, 4, 3 因为 3 可以是 4 和 5 的孩子,所以没有逻辑顺序顺序 num 可以分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2019-06-13
  • 1970-01-01
  • 2017-09-25
  • 2013-12-22
  • 2021-10-11
相关资源
最近更新 更多