Asp.net 按照1.1.1对层次表进行排序
我正在使用CTE管理我的层次结构数据。下面是我的选择查询Asp.net 按照1.1.1对层次表进行排序,asp.net,sql-server,sorting,select,common-table-expression,Asp.net,Sql Server,Sorting,Select,Common Table Expression,我正在使用CTE管理我的层次结构数据。下面是我的选择查询 WITH ctLevel AS ( SELECT C_TASK_ID AS Child ,P_Task_ID
WITH ctLevel
AS
(
SELECT
C_TASK_ID AS Child
,P_Task_ID AS Parent
,common_task. TASK_SEQ AS taskSeq
,1 AS [Level]
,CAST( TASK_SEQ AS VARCHAR(MAX)) AS [taskOrder]
,CAST (Replicate(TASK_SEQ, 1)+' '+ TASK_NAME AS VARCHAR(MAX)) AS [Task_Name]
,common_task.TASK_POSITION AS [TASK_POSITION]
FROM
[COMMON.TASK_REL] as common_task_rel,
[COMMON.TASK] as common_task
WHERE
common_task_rel.C_TASK_ID = common_task.TASK_ID
and common_task.[TASK_TYPE] = 'F' AND common_task.[MODULE_CODE] ='PRODE' AND common_task.[STATUS] <> 'D'
and common_task_rel.P_TASK_ID is null
UNION ALL
SELECT
C_TASK_ID AS Child
,P_Task_ID AS Parent
,common_task. TASK_SEQ AS taskSeq
,[Level] + 1 AS [Level]
,[taskOrder] + '.' + CAST(TASK_SEQ AS VARCHAR(MAX)) AS [taskOrder]
,CAST (Replicate(' ', [Level] + 1) + taskOrder + '.' + CAST(TASK_SEQ AS VARCHAR(MAX))+' ' +common_task.TASK_NAME AS VARCHAR(MAX)) AS [Task_Name]
,common_task.TASK_POSITION AS [TASK_POSITION]
FROM
[COMMON.TASK_REL]as common_task_rel
INNER JOIN
ctLevel
ON
( P_Task_ID = Child ) ,
[COMMON.TASK] as common_task
WHERE
common_task_rel.C_TASK_ID = common_task.TASK_ID
and common_task.[TASK_TYPE] = 'F' AND common_task.[MODULE_CODE] = 'PRODE' AND common_task.[STATUS] <> 'D'
)
SELECT [Parent] ,[Child],taskSeq, Level,[taskOrder],Task_Name,[TASK_POSITION]
FROM ctLevel
order by [taskOrder],[Level],[TASK_POSITION]
提前感谢。将数字格式化为
001
,例如:
right('000' + convert(varchar(max), [Level] + 1),3)
将数字格式化为
001
,例如:
right('000' + convert(varchar(max), [Level] + 1),3)
适用于SQL2008+ 而不是生成
Num1.Num2.Num3
。。。值您可以生成易于按ASC或DESC排序的值。将VARCHAR值转换为HIERARCHYID数据类型时,必须遵循以下语法:/Num1/Num2/Num3/
:
SELECT *, CONVERT(VARCHAR(50), T.A) AS VarCharHI, T.A.GetLevel()
FROM (VALUES
( CONVERT(HIERARCHYID, '/1/') , 'A' ),
( CONVERT(HIERARCHYID, '/2/11/1/1/1/') , 'C' ),
( CONVERT(HIERARCHYID, '/40/11/1/') , 'D' ),
( CONVERT(HIERARCHYID, '/5/11/') , 'D' ),
( CONVERT(HIERARCHYID, '/2/2/') , 'B' ) ) AS T(A,B)
ORDER BY T.A ASC;
结果:
A B VarCharHI GetLevel()
----------- ---- -------------------------------------------------- ----------
0x58 A /1/ 1
0x6B40 B /2/2/ 2
0x6D75AD60 C /2/11/1/1/1/ 5
0x8EB8 D /5/11/ 2
0xCB1AEB D /40/11/1/ 3
我会作出以下更改:
WITH ctBaseLevel
AS
(
...
,'/' + CAST( TASK_SEQ AS VARCHAR(MAX)) + '/' AS [taskOrder]
...
UNION ALL
...
,[taskOrder] + CAST(TASK_SEQ AS VARCHAR(MAX)) + '/'
...
) , ctLevel
AS
(
SELECT l.*, CONVERT(HIERARCHYID, l.[taskOrder]) AS [taskOrder_HIERARCHYID]
FROM ctBaseLevel l
)
SELECT * FROM cteLevel ORDER BY [taskOrder_HIERARCHYID];
适用于SQL2008+ 而不是生成
Num1.Num2.Num3
。。。值您可以生成易于按ASC或DESC排序的值。将VARCHAR值转换为HIERARCHYID数据类型时,必须遵循以下语法:/Num1/Num2/Num3/
:
SELECT *, CONVERT(VARCHAR(50), T.A) AS VarCharHI, T.A.GetLevel()
FROM (VALUES
( CONVERT(HIERARCHYID, '/1/') , 'A' ),
( CONVERT(HIERARCHYID, '/2/11/1/1/1/') , 'C' ),
( CONVERT(HIERARCHYID, '/40/11/1/') , 'D' ),
( CONVERT(HIERARCHYID, '/5/11/') , 'D' ),
( CONVERT(HIERARCHYID, '/2/2/') , 'B' ) ) AS T(A,B)
ORDER BY T.A ASC;
结果:
A B VarCharHI GetLevel()
----------- ---- -------------------------------------------------- ----------
0x58 A /1/ 1
0x6B40 B /2/2/ 2
0x6D75AD60 C /2/11/1/1/1/ 5
0x8EB8 D /5/11/ 2
0xCB1AEB D /40/11/1/ 3
我会作出以下更改:
WITH ctBaseLevel
AS
(
...
,'/' + CAST( TASK_SEQ AS VARCHAR(MAX)) + '/' AS [taskOrder]
...
UNION ALL
...
,[taskOrder] + CAST(TASK_SEQ AS VARCHAR(MAX)) + '/'
...
) , ctLevel
AS
(
SELECT l.*, CONVERT(HIERARCHYID, l.[taskOrder]) AS [taskOrder_HIERARCHYID]
FROM ctBaseLevel l
)
SELECT * FROM cteLevel ORDER BY [taskOrder_HIERARCHYID];
由于排序时数据将被视为文本,因此您需要确保每个部分(在“.”之间)使用相同数量的字符。为了使排序正确,需要将1表示为01。由于排序时数据将被视为文本,因此需要确保每个部分(在“.”之间)使用相同数量的字符。为了使您的排序正确,需要将1表示为01。谢谢您的解决方案。此查询在sql server 2005上有效吗?sql server 2008中引入了hierarchyid数据类型。感谢您的解决方案。此查询在sql server 2005上有效吗?在sql server 2008中引入了hierarchyid数据类型。