我有桌子:
+----+--------+----------+
| id | doc_id | next_req |
+----+--------+----------+
| 1 | 1 | 4 |
| 2 | 1 | 3 |
| 3 | 1 | 0 |
| 4 | 1 | 2 |
+----+--------+----------+
id - auto incerement主键。
nex_req - 表示记录顺序。 (记录的 next_req = id )
如何构建SQL查询以此顺序获取记录:
+----+--------+----------+
| id | doc_id | next_req |
+----+--------+----------+
| 1 | 1 | 4 |
| 4 | 1 | 2 |
| 2 | 1 | 3 |
| 3 | 1 | 0 |
+----+--------+----------+
说明:
record1 with id=1 and next_req=4 means: next must be record4 with id=4 and next_req=2
record4 with id=5 and next_req=2 means: next must be record2 with id=2 and next_req=3
record2 with id=2 and next_req=3 means: next must be record3 with id=1 and next_req=0
record3 with id=3 and next_req=0: means that this is a last record
我需要在表格中存储记录顺序。这对我很重要。
答案 0 :(得分:1)
如果可以,请更改表格格式。不是命名下一条记录,而是按顺序标记记录,以便您可以使用自然的SQL排序:
+----+--------+------+
| id | doc_id | sort |
+----+--------+------+
| 1 | 1 | 1 |
| 4 | 1 | 2 |
| 2 | 1 | 3 |
| 3 | 1 | 4 |
+----+--------+------+
然后你甚至可以在doc_id上进行集群索引,如果你需要解决性能问题,可以进行排序。老实说,如果你需要重新排序行,那么它就不像你正在使用的链接列表那样工作了。
答案 1 :(得分:0)
能够在Oracle中为您提供解决方案,
select id,doc_id,next_req from table2
start with id =
(select id from table2 where rowid=(select min(rowid) from table2))
connect by prior next_req=id
答案 2 :(得分:0)
我建议修改你的表并添加另一列OrderNumber,所以最终这个列很容易订购。
虽然这种方法可能存在问题:
1)您有现有表,需要设置OrderNumber列值。我想这部分很简单。您只需设置初始零值并添加CURSOR,例如移动记录并递增订单编号值。
2)当您的表中出现新行时,您必须修改OrderNumber,但这取决于您的具体情况。如果您只需要将项目添加到列表的末尾,那么您可以将新值设置为MAX + 1.在另一种情况下,您可以尝试在插入新项目时编写TRIGGER并调用类似步骤1)。这可能会导致性能受到很大影响,因此您必须仔细研究您的体系结构,并修改这种不寻常的结构。