首页 > 解决方案 > 使用 SQL 在另一个表中插入已排序的行

问题描述

我正在尝试对数据库表进行排序并将已排序的行插入到另一个表中。但是,当我查询新表时,它仍然有未排序的数据。

Create table #unsorted (ID int, dt date)
Insert into #unsorted values(1, '2019-01-01')
Insert into #unsorted values(2, '2018-12-15')
Insert into #unsorted values(3, '2017-01-01')

select * from #unsorted -- unsorted data as expected

Create table #sorted (ID int, dt date)

insert into #sorted 
select ID, dt from #unsorted Order by dt asc

select * from #sorted -- It should be sorted by date but it is not. 

#sorted 表的预期结果:

3   2017-01-01
2   2018-12-15
1   2019-01-01

#sorted 表的实际结果:

1   2019-01-01
2   2018-12-15
3   2017-01-01

插入另一个表时如何对表中的数据进行物理排序?

标签: sqlsql-server

解决方案


你不能 - 数据库将排序一个表的数据,但是它喜欢存储它(通常表有一个集群键,存储顺序基于形成键的列的值。如果有不是聚类键,存储顺序是不可预测的),即使这样,存储顺序也可能与输出顺序无关,具体取决于查询在其管道中执行的操作

查询时对数据进行排序

根据您计划如何使用表的数据来选择合适的集群键本身就是一门艺术,您的 DBA 会非常仔细地思考,对那些只是将 GUID 主键插入并让 SQL Server 留给 SQL Server 的开发人员绞尽脑汁。遭受 :)


推荐阅读