如何在没有查询的情况下按列对表进行排序

时间:2014-07-29 11:35:20

标签: sql sql-server jquery-ui-sortable

我想留下一个有序的表,即当我进行查询select * from NewTable时,我获得了已排序的表。

我已经尝试了,但没有按照我的方式对表格进行排序

 select column1,column2,column3,column4
  into NewTable
  from Table1,Table2
  order by column1,column2

4 个答案:

答案 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

,否则订单无法保证