带有ORDERBY子句的SQL Top子句

带有ORDERBY子句的SQL Top子句,sql,sql-server,sql-server-ce,Sql,Sql Server,Sql Server Ce,我对SQL有点陌生,我想用TOP子句和ORDERBY子句编写查询 所以,为了返回我在下面写的所有记录 从OPLMLA21..检查顺序中选择PatientName,PlanDate作为日期,* 按计划日期描述 我需要来自同一查询的前几个元素,所以我将查询修改为 从OPLMLA21..tests中选择前(5)名患者,计划日期为日期,* 按计划日期说明订购 据我所知,它将给出前一个查询的前5个结果,但我发现其中存在歧义。我已经附上了查询结果的屏幕截图 可能是我的理解是错误的,我读了很多但不能理解这

我对SQL有点陌生,我想用TOP子句和ORDERBY子句编写查询

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

从OPLMLA21..检查顺序中选择PatientName,PlanDate作为日期,*
按计划日期描述
我需要来自同一查询的前几个元素,所以我将查询修改为

从OPLMLA21..tests中选择前(5)名患者,计划日期为日期,*
按计划日期说明订购
据我所知,它将给出前一个查询的前5个结果,但我发现其中存在歧义。我已经附上了查询结果的屏幕截图

可能是我的理解是错误的,我读了很多但不能理解这一点,请帮助我

不过,我在一份声明中重申了这一点:

TOP(5)
不会给出上一个查询的“TOP results”,但不会。它会给出在其所在查询中定义的数据集中的顶部(第一)行。如果有多行具有相同的“排名”,则为该排名返回的行是任意的。因此,例如,对于您的查询,如果您有100行都具有相同的
PlanDate
值,那么每次运行所述查询时,您得到的5行完全是任意的,并且可能不同(包括它们的顺序)

我所说的“任意”的意思是,实际上,SQLServer可以自由选择返回的行中的任何行。有时,每次运行查询时,情况可能都是一样的,但这主要是运气使然。随着数据库变得越来越大,查询数据的用户越来越多,您涉及的连接、锁、索引、并行等都将影响SQL Server处理上述数据的“顺序”,并且将影响含糊不清的
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
现在,如果我使用
somedatedesc
orderby
子句对该表运行
TOP(2)
,您会期望什么。当然,您希望返回“最后”行(ID为
6
)但下一行呢?其他5行对于
SomeDate
都具有相同的值。也许,因为您认为表中的数据是预先排序的,所以对于
ID
,您可能希望该行的值为
5
。如果我告诉你在
IDASC
上有一个
聚集索引,会怎么样;这很可能意味着返回值为
1
的行。如果
SomeDate DESC
上也有索引怎么办

如果表的大小为10000行,并且您还有一个
连接到另一个表的
,该表也有一个
聚集索引
,并且在您运行查询时,某个用户正在执行某个特定行锁定的查询,该怎么办?那么你会期待什么呢

如果您的
orderby
不够具体,无法确保每一行都有一个不同的排序位置,SQL Server将以任意顺序返回其他行,当与
TOP混用时,则表示“TOP”行也是任意的


旁注:我注意到在您的图像(看起来是SSM)中,您的“日期”格式为
yyyyMMdd
。这意味着您将日期值存储为
varchar
int
类型。这是一个设计缺陷,需要修复。有6种日期和时间数据类型,其中5种远远优于使用字符串和数字数据类型来存储数据。

什么是真正使用SQL Server或MySQL的?你真的在用压缩版吗?自2013年以来,CE一直被弃用!我正在使用SQL Server然后相应地标记,不要标记垃圾邮件。
TOP(5)
不会给出上一个查询的“TOP results”,但不会。它会给出在查询中定义的数据集中的TOP(first)行。如果有多行具有相同的“排名”,则为该排名返回的行是任意的。因此,例如,对于您的查询,如果您有100行都具有相同的
PlanDate
值,那么您得到的5行完全是任意的,并且可能不同(包括它们的顺序)每次运行上述查询时,之所以很难发现此类错误,是因为编译器每次都可以选择相同的非并行查询计划,并且将始终返回相同的结果,除非有一次没有。因此,开发人员认为查询是正确的,但事实并非如此。当需要按特定顺序排列数据时,请确保添加正确的
orderby
列。如果您需要保证两次运行之间的确定性结果,请在Ordering中添加一个唯一的列(非常感谢:)