Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
tsql中具有父列的order by表_Sql_Sql Server_Tsql_Sql Order By - Fatal编程技术网

tsql中具有父列的order by表

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

我有一个定义了父列的表

我需要用这样的列来排列这个表

如何使用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 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级层次结构。第一行是一列,第二行是一列,第二行是一列,第二行是一列,第二行是一列,第二行是一列,这正是我需要的