sql - SELECT DISTINCT ... WHERE ...“随机”结果的顺序是什么?
问题描述
我有一个读取的 SQL 查询
SELECT DISTINCT [NR] AS K_ID
FROM [DB].[staging].[TABLE]
WHERE [N]=1 and [O]='XXX' and [TYPE] in ('1_P', '2_I')
由于我将结果保存在受版本控制的 CSV 文件(通过 Python Pandas)中,因此我注意到每次运行查询时结果的顺序都会发生变化。为了消除这里的 Python 部分,我在 MS SQL Server Management Studio 中运行了查询,每次尝试时我都会观察到不同的顺序。
在我的情况下没关系,但是:是否正确,每次执行时查询结果的排序都不同?如果是这样,有没有办法使订单“确定”?
解决方案
SQL 数据库基于关系代数集理论概念,您认为的表更正式地称为无序关系。除非您指定ORDER BY
,否则数据库可以按照方便的顺序自由返回数据。
此顺序可能匹配索引,而不是磁盘上的顺序。它也可能从数据中间开始,如果数据库可以利用已经在进行的另一个查询的工作来减少两者之间的总读取(企业版将这样做)。
更糟糕的是,甚至磁盘上的顺序也可能发生变化。如果没有主键,数据库甚至可以移动页面以帮助事情更有效地运行。
换句话说,如果顺序很重要(而且通常很重要),请指定一个ORDER BY
子句。
推荐阅读
- android - 如何在地图视图(Android)中显示纬度和经度?
- php - 如何防止 Quickbooks Online API 中的重复发票?
- arrays - 如何使用另一个相同大小的数组索引 numpy 数组
- azure - 使用 Connect-AzAccount 时如何防止“选择帐户”交互式工作流
- mongodb - 为什么我的 Getter 函数不能与 Mongoose 一起使用?
- multithreading - cuda内核'volta_sgemm_128x32_nn'是什么意思?
- logstash - 改进我的多行 javastack 日志的工作 grok 模式
- php - PHP练习函数($result)不能调用
- laravel - Laravel 8 Vue 包找不到声明模块
- angular - Angular 和基于 Spring 的 Web 应用程序中的验证码实现