【发布时间】: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