根据列中的值排序SQL查询,确定下一行中另一列的值

时间:2012-11-16 18:26:26

标签: sql sql-server-2008 sql-order-by

我的表格如下:

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

除了表格全部乱序之外。 (没有重复,所以这不是问题。)我想知道是否有任何方法可以进行查询以排序输出,基本上说“下一行'值'=此行'下一行'”,因为它显示上面?

我无法控制数据库以及如何存储这些数据。我只是想检索它并组织它。 SQL Server我相信2008年。

我意识到事后重新组织并不困难,但我只是好奇我是否可以编写一个开箱即用的查询,所以我不必担心它。

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

使用recursive query,我在此处列出的一个,您可以在链接列表中包含多个路径:

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

fiddle here

答案 2 :(得分: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),同时记住到达当前节点所需的递归深度(Depth)。

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

答案 3 :(得分: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

Example

答案 4 :(得分: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