我的表格如下:
Value Previous Next
37 NULL 42
42 37 3
3 42 79
79 3 NULL
除了表格全部乱序之外。 (没有重复,所以这不是问题。)我想知道是否有任何方法可以进行查询以排序输出,基本上说“下一行'值'=此行'下一行'”,因为它显示上面?
我无法控制数据库以及如何存储这些数据。我只是想检索它并组织它。 SQL Server我相信2008年。
我意识到事后重新组织并不困难,但我只是好奇我是否可以编写一个开箱即用的查询,所以我不必担心它。
答案 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
答案 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
答案 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