Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL在另一个表中插入已排序的行_Sql_Sql Server - Fatal编程技术网

使用SQL在另一个表中插入已排序的行

使用SQL在另一个表中插入已排序的行,sql,sql-server,Sql,Sql Server,我正在尝试对数据库表进行排序,并将排序后的行插入另一个表中。但是,当我查询新表时,它仍然有未排序的数据 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 #uns

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

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. 
#排序表的预期结果:

3   2017-01-01
2   2018-12-15
1   2019-01-01
1   2019-01-01
2   2018-12-15
3   2017-01-01
#排序表的实际结果:

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

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

您不能-数据库在存储数据时会按自己喜欢的方式对表中的数据进行排序(通常表有一个聚类键,存储顺序基于列的值)如果没有集群键,则存储顺序是不可预测的),即使如此,存储顺序也可能与输出顺序无关,这取决于查询在其管道中执行的操作

在查询数据时对其进行排序


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

SQL表和结果集表示无序(多)集。结果集中没有排序,除非显式使用了
orderby
。我明白了,感谢您的快速回复。我明白了,我需要它,因为SQL不允许在游标中使用orderby。我将为另一个问题创建另一个帖子。谢谢。事实上,我认为这是一个XY问题-发布给您带来麻烦的查询。。我们可能会帮助重写它,以消除对游标的需要(通常开发人员认为他们只需要游标,因为基于集合的思考不是自然产生的),您无法订购视图。在另一篇文章中发布了原始问题@开发人员脱离主题,但重申:“SQL不允许游标中的ORDERBY”-当然允许。