Sql 提供两种不同输出的按查询排序

Sql 提供两种不同输出的按查询排序,sql,sql-server,sql-server-2008,sql-order-by,Sql,Sql Server,Sql Server 2008,Sql Order By,我有一个student表,在[name,address,TotalFees]列中有8条记录 即使我在一个表上执行两个相同的orderby查询,我也会得到两个不同的输出。我已经附上了下面的截图 相同表上的相同查询具有不同的输出: 您遇到的问题是,order by的键没有唯一地定义每一行。特别是对大多数行重复“khar”(您的结果表明您使用的是不区分大小写的排序规则) 在SQL数据库中,排序不稳定。稳定排序是使用相同的键保留值的原始顺序的排序。因为排序是不稳定的,所以对于相同的键,结果可以以任何顺序

我有一个student表,在[name,address,TotalFees]列中有8条记录

即使我在一个表上执行两个相同的
orderby
查询,我也会得到两个不同的输出。我已经附上了下面的截图

相同表上的相同查询具有不同的输出:


您遇到的问题是,
order by
的键没有唯一地定义每一行。特别是对大多数行重复“khar”(您的结果表明您使用的是不区分大小写的排序规则)

在SQL数据库中,排序不稳定。稳定排序是使用相同的键保留值的原始顺序的排序。因为排序是不稳定的,所以对于相同的键,结果可以以任何顺序出现

为什么这类东西不稳定?回想起来,这很容易。SQL表和结果集表示无序集。没有初始排序,因此排序不稳定


解决此问题的常规方法是在
按地址排序的id
中包含一个唯一id作为最后一个键:
按地址排序的id
。但是,对于您的数据,不清楚唯一键是什么。

您遇到的问题是,
orderby
的键没有唯一地定义每一行。特别是对大多数行重复“khar”(您的结果表明您使用的是不区分大小写的排序规则)

在SQL数据库中,排序不稳定。稳定排序是使用相同的键保留值的原始顺序的排序。因为排序是不稳定的,所以对于相同的键,结果可以以任何顺序出现

为什么这类东西不稳定?回想起来,这很容易。SQL表和结果集表示无序集。没有初始排序,因此排序不稳定


解决此问题的常规方法是在
按地址排序的id
中包含一个唯一id作为最后一个键:
按地址排序的id
。但是,对于您的数据,不清楚唯一密钥是什么。

地址和名称的组合不会产生重复项,因此您可以尝试此方法

select *From student
order by address,name

select top 3 * From student
order by address,name

地址和名称的组合不会产生重复项,因此您可以尝试

select *From student
order by address,name

select top 3 * From student
order by address,name

这两种方法产生的结果都与您在订购方中要求的保证一致。如果您想要更有力的保证,您必须通过向该
ORDER by
添加额外的列或表达式来请求它们。这是一个非常好的例子,绝对没有隐式排序顺序,每次调用都可能以不同的顺序返回,只要组合值中的
ORDER BY
列不是唯一的,。。。。你的问题是什么?但我唯一关心的是,当我只想反映第一个输出表中的前3个值时,为什么第二个输出表中的第3个结果会发生变化。因为第一个查询返回的结果可能有720个不同的顺序,并且所有这些顺序都与你要求的一致。几乎任何东西都可以改变,查询返回特定的顺序。在某些情况下,仅在一行中运行同一查询两次可能会以不同的顺序返回结果。您的第二个查询与这些可能的订单中的120个一致。服务器可以按照最方便的顺序自由处理结果集,前提是它符合您所说的所需的范围——
order BY
。这两种方法都会产生与您在
order BY
中要求的保证一致的结果。如果您想要更有力的保证,您必须通过向该
ORDER by
添加额外的列或表达式来请求它们。这是一个非常好的例子,绝对没有隐式排序顺序,每次调用都可能以不同的顺序返回,只要组合值中的
ORDER BY
列不是唯一的,。。。。你的问题是什么?但我唯一关心的是,当我只想反映第一个输出表中的前3个值时,为什么第二个输出表中的第3个结果会发生变化。因为第一个查询返回的结果可能有720个不同的顺序,并且所有这些顺序都与你要求的一致。几乎任何东西都可以改变,查询返回特定的顺序。在某些情况下,仅在一行中运行同一查询两次可能会以不同的顺序返回结果。您的第二个查询与这些可能的订单中的120个一致。服务器可以按照最方便的顺序自由处理结果集,但我唯一关心的是,当我只想反映第一个输出表中的前三个值时,为什么第二个输出表中的第三个结果会发生变化。但我唯一关心的是,当我想反映时,第二个输出表中的第三个结果会发生变化只有第一个输出表中的前3个值。但我唯一关心的是,当我只想反映第一个输出表中的前3个值时,为什么第二个输出表中的第3个结果会发生变化。@NiKhilKutewalla。因为排序依据对键有重复的值,所以每次运行时都会产生不同的结果。我想这就解释了发生的事情。但我唯一关心的是,当我只想反映第一个输出表中的前三个值时,为什么第二个输出表中的第三个结果会发生变化。@NiKhilKutewalla。因为排序依据对键有重复的值,所以每次运行时都会产生不同的结果。我认为这解释了正在发生的事情。