按日期重新排序/更新sql行

时间:2011-02-17 07:18:59

标签: sql date sql-update

是否可以重新排序sql表行?

我有大约8000行,他们有点乱,因为日期与id相比无序,我知道你可以通过删除和重新添加id(INT auto imp)来重置顺序但我想重新订购按日期。

我知道我可以简单地从脚本中“订购日期”,但我宁愿“订购ID”并拥有一个干净的DB ......

我猜它是一个UPDATE ...查询并且已经搜索了高位和低位以获得答案,但还没有找到它。

3 个答案:

答案 0 :(得分:1)

我不同意你的目标,但我认为你可以编写一个程序:

  • 选择按日期排序的所有行,将它们保存在记录集中(使用游标)
  • 从表中删除所有行
  • 循环添加每一行,利用自动增量ID

答案 1 :(得分:0)

我真的不同意这个目标,但是。

在SQL Server 2005+中,您可以使用它。一次执行它会保持表约束,默认值等完整,同时仍然遵守其他表中的所有外键挂钩。

create table badlyordered( id int identity, date datetime, otherdata varchar(100))
insert badlyordered(date) select getdate()+4
insert badlyordered(date) select getdate()+2
insert badlyordered(date) select getdate()+3
insert badlyordered(date) select getdate()
insert badlyordered(date) select getdate()+10
insert badlyordered(date) select getdate()-10
update badlyordered set otherdata = date

select * from badlyordered order by id

id          date                    otherdata
----------- ----------------------- ---------------------
7           2011-02-21 18:51:55.087 Feb 21 2011  6:51PM
8           2011-02-19 18:51:55.087 Feb 19 2011  6:51PM
9           2011-02-20 18:51:55.087 Feb 20 2011  6:51PM
10          2011-02-17 18:51:55.087 Feb 17 2011  6:51PM
11          2011-02-27 18:51:55.087 Feb 27 2011  6:51PM
12          2011-02-07 18:51:55.087 Feb  7 2011  6:51PM

;with tmp as (
select *,
table_seq = row_number() over (order by id),
nice_seq = row_number() over (order by date, id)
from badlyordered
)
update t1
set date = t2.date
   ,otherdata = t2.otherdata
   -- and any other columns in the table
from tmp t1
inner join tmp t2 on t1.table_seq=t2.nice_seq

select * from badlyordered order by id

id          date                    otherdata
----------- ----------------------- ---------------------
7           2011-02-07 18:51:55.087 Feb  7 2011  6:51PM
8           2011-02-17 18:51:55.087 Feb 17 2011  6:51PM
9           2011-02-19 18:51:55.087 Feb 19 2011  6:51PM
10          2011-02-20 18:51:55.087 Feb 20 2011  6:51PM
11          2011-02-21 18:51:55.087 Feb 21 2011  6:51PM
12          2011-02-27 18:51:55.087 Feb 27 2011  6:51PM

但我知道你在使用MySQL。你可以在MySQL中使用变量进行两次行编号,然后使用行号来执行更新。

这将生成与SQL Server中的CTE相同的数据。

select ..(rownumber variable by date).. from
(
select ..(rownumber variable by id).. from tbl order by id
) n

然后你需要2(!)个

select n.id, o.id
from
(

select ..(rownumber variable by date).. from
(
select ..(rownumber variable by id).. from tbl order by id
) n

inner join

select ..(rownumber variable by date).. from
(
select ..(rownumber variable by id).. from tbl order by id
) n

on ....
) o

生成从原始到目标的更新ID的映射。最后,您需要使用UPDATE FROM JOIN MySQL技术将表连接到这组ID以执行更新。

答案 2 :(得分:0)

用于什么ID?您似乎没有更改ID的问题,但如果它引用其他地方将是一个问题。如果未在其他地方引用它,那么您可能需要重新考虑数据库设计,因为列可能会消失。

如果您仍想这样做,您是否可以创建一个带有标识列的新表并插入没有id列的行数据,删除旧表并使用旧表的名称重命名新表。