0

我的表如下所示:

Value     Previous     Next
37        NULL         42
42        37           3
3         42           79
79        3            NULL

除了,桌子全乱了。(没有重复,所以这不是问题。)我想知道是否有任何方法可以对输出进行排序,基本上说“下一行'值'=这一行'下一个'”,如图所示多于 ?

我无法控制数据库以及这些数据的存储方式。我只是想找回它并组织它。我相信 2008 年的 SQL Server。

我意识到这在之后重组并不难,但我只是好奇我是否可以编写一个开箱即用的查询,这样我就不必担心了。

4

5 回答 5

1

如果您正在使用Oracle,请尝试Starts with- connect by

    select ... start with initial-condition connect by 
    nocycle recursive-condition;

编辑:对于 SQL-Server,使用WITH如下语法:

WITH rec(value, previous, next) AS 
  (SELECT value, previous, next 
    FROM table1
    WHERE previous is null
    UNION ALL
    SELECT nextRec.value, nextRec.previous, nextRec.next
    FROM table1 as nextRec, rec
    WHERE rec.next = nextRec.value)
  SELECT value, previous, next FROM rec;
于 2012-11-16T18:35:30.877 回答
1

使用递归查询,在此处列出的 i 中,您的链表可以有多个路径:

with cte (Value, Previous, Next, Level)
as
(
  select Value, Previous, Next, 0 as Level
  from data
  where Previous is null

  union all

  select d.Value, d.Previous, d.Next, Level + 1
  from data d
    inner join cte c on d.Previous = c.Value  
)

select * from cte

在这里摆弄

于 2012-11-16T18:56:09.457 回答
1

这应该做你需要的:

WITH CTE AS (
    SELECT YourTable.*, 0 Depth
    FROM YourTable
    WHERE Previous IS NULL
    UNION ALL
    SELECT YourTable.*, Depth + 1
    FROM YourTable JOIN CTE
        ON YourTable.Value = CTE.Next
)
SELECT * FROM CTE
ORDER BY Depth;

[SQL Fiddle] (为简洁起见,省略了引用完整性和索引。)

我们使用递归公用表表达式 ( CTE) 从列表的头部 ( WHERE Previous IS NULL) 移动到尾随节点 ( ON YourTable.Value = CTE.Next),同时记住到达当前节点 (in Depth) 所需的递归深度。

最后,我们只需按到达每个节点所需的递归深度进行排序(ORDER BY Depth)。

于 2012-11-16T20:21:03.907 回答
0

像这样的东西应该工作:

With Parent As (
  Select
    Value,
    Previous,
    Next
  From
    table
  Where
    Previous Is Null
  Union All
  Select
    t.Value,
    t.Previous,
    t.Next
  From
    table t
      Inner Join  
    Parent
      On Parent.Next = t.Value
)

Select
  *
From
  Parent

例子

于 2012-11-16T18:34:51.680 回答
0

一种方法是使用连接:

select t.*
from t left outer join
     t tnext
     on t.next = tnext.val
order by tnext.value

然而,这样不行吗?

select t.*
from t
order by t.next
于 2012-11-16T18:36:04.840 回答