首页 > 解决方案 > 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 中运行了查询,每次尝试时我都会观察到不同的顺序。

在我的情况下没关系,但是:是否正确,每次执行时查询结果的排序都不同?如果是这样,有没有办法使订单“确定”?

标签: sqlsql-servertsqlsql-order-by

解决方案


SQL 数据库基于关系代数集理论概念,您认为的表更正式地称为无序关系。除非您指定ORDER BY,否则数据库可以按照方便的顺序自由返回数据。

此顺序可能匹配索引,而不是磁盘上的顺序。它也可能从数据中间开始,如果数据库可以利用已经在进行的另一个查询的工作来减少两者之间的总读取(企业版将这样做)。

更糟糕的是,甚至磁盘上的顺序也可能发生变化。如果没有主键,数据库甚至可以移动页面以帮助事情更有效地运行。

换句话说,如果顺序很重要(而且通常很重要),请指定一个ORDER BY子句。


推荐阅读