SQL 带有 order by 子句的顶级子句

SQL Top clause with order by clause

我对 SQL 有点陌生,我想用 TOP 子句编写查询并按子句排序。

所以,为了返回我在查询下面写的所有记录

select PatientName,PlanDate as Date,* from    OPLMLA21..Exams  order
by PlanDate desc

而且我需要来自同一个查询的前几个元素,所以我将查询修改为

select top(5) PatientName,PlanDate as Date,* from    OPLMLA21..Exams 
order by PlanDate desc

据我所知,它将给出前一个查询的前 5 个结果,但我发现那里有歧义。我附上了查询结果的屏幕截图。

可能是我的理解有误,看了很多书还是看不懂,求大神指点。

我在 中声明了这一点,但是,再重复一遍:

 TOP (5) doesn't give the "top results" of the prior query though, no. It gives the top (first) rows from the dataset defined in the query it in is. If there are multiple rows that have the same "rank", then the row(s) returned for that rank are arbitrary. So, for example, for your query if you have 100 rows all with the same value for PlanDate, what 5 rows you get are completely arbitrary and could be different (including the order they are in) every time you run said query.

我所说的任意的意思是,实际上,SQL 服务器可以自由选择任何适用的行,returned。 有时 这可能在您每次 运行 查询时都是一样的,但这完全是靠运气。随着你的数据库变大,你有更多的用户查询数据,你涉及连接,锁,索引,并行性等都会影响 SQL 服务器处理所述数据的“顺序”,并且 影响模棱两可的TOP条款。

以下面的示例数据为例:

ID | SomeDate
---|---------
1  |2020-01-01
2  |2020-01-01
3  |2020-01-01
4  |2020-01-01
5  |2020-01-01
6  |2020-01-02

现在,如果我 运行 一个 TOP (2) 反对那个 table 和 SomeDate DESCORDER BY 子句,你会期待什么?嗯,当然,您希望“最后”行(ID6)被 return 编辑,但是下一行呢? SomeDate 的其他 5 行都具有相同的值。也许,因为您认为 table 中的数据是预先排序的,您可能期望 ID 的值为 5 的行。如果我告诉你 ID ASC 上有一个 CLUSTERED INDEX 怎么办?这很可能最终意味着值为 1 的行被 returned。如果 SomeDate DESC 上也有索引怎么办?

如果 table 的大小为 10,000 行,并且您还有一个 JOIN 到另一个 table,它也有一个 CLUSTERED INDEX,并且一些当您 运行 您的查询时,用户正在执行锁定某些特定行的查询?那你会期待什么?

如果您的 ORDER BY 不够具体以确保每一行都有不同的排序位置,SQL 服务器将 return 其他行以任意顺序排列,并且当与 TOP 表示“顶部”行也是任意的。

旁注:我在您的图片(似乎是 SSMS)中注意到,您的“日期”格式为 yyyyMMddstrongly 暗示您将日期值存储为 varcharint 类型。这是一个设计缺陷, 需要 修复。有 6 种日期和时间数据类型,其中 5 种远优于使用字符串和数字数据类型存储数据。