tsql中具有父列的order by表
我有一个定义了父列的表 我需要用这样的列来排列这个表 如何使用t-sql实现这一点tsql中具有父列的order by表,sql,sql-server,tsql,sql-order-by,Sql,Sql Server,Tsql,Sql Order By,我有一个定义了父列的表 我需要用这样的列来排列这个表 如何使用t-sql实现这一点 谢谢。如果只有两个级别,正如您的评论所示,那么这很简单: SELECT A,Parent_A FROM UnnamedTable ORDER BY CASE WHEN Parent_A = 0 THEN A ELSE Parent_A END, --Sort parents together with their children Parent_A --Ensure parents sort befor
谢谢。如果只有两个级别,正如您的评论所示,那么这很简单:
SELECT A,Parent_A
FROM UnnamedTable
ORDER BY
CASE WHEN Parent_A = 0 THEN A ELSE Parent_A END, --Sort parents together with their children
Parent_A --Ensure parents sort before their children
如果实际上可以有多个级别,则需要使用递归CTE:
declare @t table (
A int not null,
Parent_A int not null)
insert into @t (A,Parent_A) values
(1,0),(2,0),(3,1),(4,2),(5,3)
;With Hier as (
select A,'/' + CONVERT(varchar(max),A) + '/' as position
from @t where Parent_A = 0
union all
select t.A,position + CONVERT(varchar(max),t.A) + '/'
from Hier h
inner join
@t t
on
h.A = t.Parent_A
), Converted as (
select A,CONVERT(hierarchyid,position) as position
from Hier
)
select t.A,t.Parent_A
from Converted c
inner join
@t t
on c.A = t.A
order by c.position
试试这个
;WITH TableA AS (
SELECT 1 AS pk,0 AS REF
UNION ALL
SELECT 2,0
UNION ALL
SELECT 3,1
UNION ALL
SELECT 4,2
), CTE AS (
SELECT pk AS masterid, pk AS basePK, REF AS baseRef
FROM TableA
WHERE REF = 0
UNION ALL
SELECT B.masterid, A.pk, A.REF
FROM TableA AS A
INNER JOIN CTE AS B ON B.basePK = A.REF
WHERE A.REF <> 0
)
SELECT * FROM CTE
ORDER BY masterid,basepk
0,1,0,2看起来不像一个有序列表。是否只有一个层次结构级别,或者是否有第五行的父元素a等于3,应该在预期输出的第3行和第2行之间排序?实际上是2级层次结构。第一行是一列,第二行是一列,第二行是一列,第二行是一列,第二行是一列,第二行是一列,这正是我需要的