我想留下一个有序的表,即当我进行查询select * from NewTable
时,我获得了已排序的表。
我已经尝试了,但没有按照我的方式对表格进行排序
select column1,column2,column3,column4
into NewTable
from Table1,Table2
order by column1,column2
答案 0 :(得分:3)
使用order by
时,您只能按特定顺序获取结果集。表表示无序集,因此除了作为结果集输出外,它们没有顺序。
但是,您可以使用SQL Server中的技巧来快速执行order by
。诀窍是在插入中使用order by
并具有标识主键。然后通过主键排序应该非常有效。你可以这样做:
create table NewTable (
NewTableId int identity(1, 1) not null primary key,
column1 . . .
. . .
);
insert into NewTable(column1, column2, column3, column4)
select column1, column2, column3, column4
from Table1 cross joinTable2
order by column1, column2;
现在当您从表中选择时:
select column1, column2, column3, column4
from NewTable
order by id;
您按主键排序,并没有进行真正的排序。
答案 1 :(得分:1)
表的聚簇索引决定了数据的排序方式,本例将演示它:
CREATE TABLE test (id int, value varchar)
INSERT INTO test VALUES(1, 'z')
INSERT INTO test VALUES(2, 'y')
INSERT INTO test VALUES(3, 'x')
SELECT * FROM test
CREATE CLUSTERED INDEX IX_test ON test (value ASC)
SELECT * FROM test
结果如下:
id value
----------- -----
1 z
2 y
3 x
id value
----------- -----
3 x
2 y
1 z
创建索引后,结果会反转,因为索引正在按值列升序排序。
但请注意,正如其他人所提到的,获得正确排序结果的唯一100%保证方法是使用ORDER BY
子句。
答案 2 :(得分:1)
答案“表的聚集索引决定数据的排序方式......”不正确。 如果没有ORDER BY,结果集将以随机顺序返回。
这取决于许多事实。但其中一个显而易见的是使用的索引:
这是一个简单的例子,表明前面的陈述是错误的:
create table #t (id int identity (1,1) primary key clustered, col1 int)
INSERT INTO #t (col1)
values
(5),
(4),
(3),
(2),
(1),
(0)
SELECT col1 FROM #t
CREATE INDEX IX_t
ON #t (col1);
SELECT col1 FROM #t
即使存在聚集索引,但是在不同排序顺序中使用覆盖索引,将更有可能按照使用的索引而不是聚簇索引的顺序返回数据。 但是如果内存中已经存在某些页面而其他页面需要从光盘加载,则结果集可能会再次显示不同。
总结:如果没有ORDER BY,则无法保证排序顺序。
答案 3 :(得分:0)
结果集的ORDER
由执行计划决定,如果查询使用索引并且没有ORDER BY
,那么排序将是该索引的结果。除非您发出ORDER BY