sql - 使用 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
插入另一个表时如何对表中的数据进行物理排序?
解决方案
你不能 - 数据库将排序一个表的数据,但是它喜欢存储它(通常表有一个集群键,存储顺序基于形成键的列的值。如果有不是聚类键,存储顺序是不可预测的),即使这样,存储顺序也可能与输出顺序无关,具体取决于查询在其管道中执行的操作
查询时对数据进行排序
根据您计划如何使用表的数据来选择合适的集群键本身就是一门艺术,您的 DBA 会非常仔细地思考,对那些只是将 GUID 主键插入并让 SQL Server 留给 SQL Server 的开发人员绞尽脑汁。遭受 :)
推荐阅读
- java - 试图从 spring-boot-starter 中排除默认记录器,但排除不起作用(LoggerFactory 不是 Logback LoggerContext)
- arrays - 通过一些具有多个条件的过滤数组
- java - 为什么我的代码没有填写数据库中的表?
- python - 使用 fast_executemany = True 与 sqlalchemy 和 Pandas
- optimization - 优化中的条件约束不使用整数或非线性方程
- python - 在再次运行之前在 VSC 中自动保存和擦除修改过的脚本
- apache-spark - Spark BlockManager 监听本地主机
- javascript - 更改 @observable 属性不要在我的项目中使用 mobx 重新渲染观察者组件
- c++ - 将 32 位 directx9 应用程序转换为大地址感知
- docker - 如何在特定驱动程序中保存 Docker 文件(图像、容器)?