3

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

SELECT * 
   INTO new_table
FROM existing_table
ORDER BY col1, col2

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

4

4 回答 4

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;

不保证结果的顺序。插入到表中的顺序是什么没有区别。您不能仅仅因为行是这样排序的,就依赖于结果按特定顺序排列。例如,在多线程环境中,无论在理论上还是在实践中,结果通常都不是有序的。

于 2013-05-18T13:31:01.173 回答
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
于 2014-08-19T16:32:45.820 回答
0

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

你需要把它分成两部分。始终ORDER BY在将输出呈现给您使用的任何客户端的脚本中应用该子句:

SELECT * 
INTO   new_table
FROM   existing_table

SELECT   *
FROM     new_table
ORDER BY col1, 
         col2
于 2013-05-18T13:58:38.320 回答
0

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

INSERT INTO new_table
      (col1, col2)
SELECT (col1, col2)
FROM existing_table
ORDER BY col1, col2
于 2013-07-10T22:12:58.523 回答