如何按升序排列表格的行并同时保存表格?

时间:2013-05-18 09:08:25

标签: sql sql-server sql-server-2008 sql-server-2005

我想通过从现有表中按升序排列行来创建新表。我试图使用的代码是:

SELECT * 
   INTO new_table
FROM existing_table
ORDER BY col1, col2

然而,新表没有显示任何行的升序排列。谁能告诉我这段代码有什么问题?

4 个答案:

答案 0 :(得分:2)

中的行是无序的,因此讨论按行排序是没有意义的。并且,查询的结果集是无序的,除非您使用order by子句。

也就是说,您可以以有序的方式将行放入表中。这是一种方法。

select top 0 *
into new_table
from existing_table;

alter table new_table add new_table_id int identity(1, 1);

insert into new_table(<list of columns without new_table_id>)
    SELECT <list of columns without new_table_id>
    INTO new_table
    FROM existing_table
    ORDER BY col1, col2;

保证id列的顺序正确。实际上,似乎行将按顺序插入。严格地说,虽然id的值是正确排序的,但不保证插入顺序。

如评论中所述,您也可以这样做:

alter table new_table add new_table_id int identity(1, 1) not null primary key;

您可以这样做,因为该表为空。作为主键,数据应按顺序插入。

但请注意。查询:

select *
from new_table;

不保证结果的排序。插入顺序对表的影响没有区别。您不能仅仅因为行以这种方式排序而依赖于特定顺序的结果。例如,在多线程环境中,无论是在理论上还是在实践中,结果通常都不是

答案 1 :(得分:0)

您引用的脚本不保证从new_table中提取的数据的顺序。

您需要将其拆分为两个。始终在脚本中应用ORDER BY子句,将输出呈现给您正在使用的客户端:

SELECT * 
INTO   new_table
FROM   existing_table

SELECT   *
FROM     new_table
ORDER BY col1, 
         col2

答案 2 :(得分:0)

如果你的 new_table 除了col1和col2之外还有 PRIMARY KEY ,那么这在MSSQL2012中有效。

INSERT INTO new_table
      (col1, col2)
SELECT (col1, col2)
FROM existing_table
ORDER BY col1, col2

答案 3 :(得分:0)

首先将其插入到临时表中,该临时表具有标识列,然后是真实表,例如......

Declare @TempTable as table (
   id int identity (1,1),
   col1 varchar(255) null,
   col2 varchar(255) null
)

Insert into @TempTable 
select *
from existing_table
order by col1, col2

-- select * from @TempTable T  <--- Ive tested up to here and it works

insert into new_table (col1,col2)
select col1, col2
from @TempTable T