SQL Server:以相反的顺序将表复制到另一个表中

时间:2012-10-21 08:36:38

标签: sql sql-server database

我有一个表格,表示较新的数据以id=1开头并增加id,我们得到旧数据,现在问题是,因为每天都会添加新数据,我想要要显示从新到旧的结果,会出现问题。我希望颠倒表的顺序,即使添加了新数据,我也可以显示从较新数据到较旧数据的数据。

有谁知道我应该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以对切换发生时的任意数字进行硬编码。假设你现在有1000行(所以#1是最新的,但#1001将是添加时最新的):

SELECT (CASE WHEN id < 1000 THEN id * -1 ELSE id END) AS sort_order
ORDER BY sort_order DESC

可能更好的解决方案是添加时间戳列,因为依靠自动生成的列来获取真实数据并不好。

修改

要创建新表,请使用上面的插入。

INSERT INTO [new_table] (col1,col2,col3, ...)
SELECT (col1, col2, col3, ...)
FROM [old_table]
ORDER BY (CASE WHEN id < 1000 THEN id * -1 ELSE id END) DESC

答案 1 :(得分:1)

最好在表格中添加datetime字段。

但是,您的ID不能直接用作订单字段,因为直到现在ID = 1是最新的,但是从现在开始,每个新记录都会获得比X更高的ID。因此,您需要识别X,这是ID的值。迄今为止最古老的记录然后您可以通过两种情况订购:

  • 属于 low-id = new high-id = new 组?

以下是X=10

的示例
    SELECT ID 
    FROM dbo.tbl
    ORDER BY CASE WHEN ID <=10 THEN ID ELSE -ID END ASC

这是小提琴:http://sqlfiddle.com/#!6/95c9a/3/0


  

但我想将内容复制到新表中,这样我就不需要了   以不同的方式对待它们

然后你可以使用上面的sql按顺序插入新表。我会在ID使用新的IDENTITY(1,1)列:

INSERT INTO dbo.tblCopy
  SELECT ID 
  FROM dbo.tbl
  ORDER BY CASE WHEN ID <=10 THEN ID ELSE -ID END ASC

如果您不想添加其他列,并且想要重复使用旧ID,则可以使用上面ROW_NUMBER的{​​{1}}:

CASE

演示:http://sqlfiddle.com/#!6/00213/1/0