【问题标题】:How to get the last row from a table in SQL Server?如何从 SQL Server 中的表中获取最后一行?
【发布时间】:2018-01-09 12:27:17
【问题描述】:

我有一张表,它只有一列varchar

我想得到最后一行,但我不能申请order by

以下查询没有给出所需的结果。

select top 1 from SampleTbl order by columnName desc

【问题讨论】:

  • “我不能申请订单” 你不能吗?为什么不?在我看来,就像您所做的那样... “以下查询没有给出所需的结果。” 为什么不呢?要求的结果是什么?你得到了什么结果?表中数据的例子是什么,应该返回哪个“最后一行”“last”的标准是什么?请阅读帮助中心,了解如何提出一个好的、清晰的问题。您可能会尝试对 varchar 进行排序,就好像它是一个数字一样,而不喜欢您得到的 ASCII 排序,但是如果描述如此模糊,怎么会有人知道呢?
  • 如果数据是 "Querying,SQL,Server" 。它应该给服务器,但它给 SQL
  • 我将 varchar 作为数据类型
  • 没有“最后一行”之类的东西,因为没有行的顺序,除非你用ORDER BY 指定它。 ORDER BY 也没有任何问题。发布一个 reproducible 示例 - 表脚本、INSERT 语句、返回您所说内容的 SQL 语句以及您期望的示例
  • @viveknuna whySQL 很明显是字典序上的最后一个值时返回Server?为什么要出现 middle 值?你的标准是什么?

标签: sql-server


【解决方案1】:

数据库表本质上是未排序的。表格中没有最后一行

如果存在聚集索引,则记录的存储顺序与聚集索引相同,但这并不意味着行的顺序 - 除非您在查询中指定 order by 子句,否则数据库无法保证所述查询返回的行的顺序。

来自Wikipedia page on tables(强调我的):

就数据库的关系模型而言,表可以被认为是关系的一种方便表示,但两者并不是严格等价的。例如,SQL 表可能包含重复的行,而真正的关系不能包含重复的元组。类似地,作为表的表示意味着对行和列的特定排序,而关系是明确无序的。但是,数据库系统不保证行的任何顺序,除非在查询表的 SELECT 语句中指定了 ORDER BY 子句。

另请参阅 Aaron Betrand 的 Bad habits to kick : relying on undocumented behavior,标题为“Ordering without an ORDER BY”的段落:

...我想说得很清楚:除非您使用 ORDER BY 子句,否则排序是任意的。您永远不应该依赖您在没有 ORDER BY 的查询中观察到的顺序 - 如果您真的不关心结果返回的顺序,您应该只发出没有 ORDER BY 子句的查询。在这种情况下,您不妨想象行每次都会以不同的随机顺序返回,即使情况并非如此(随机具有与任意完全不同的含义,但就像我说的,想象一下)。

【讨论】:

  • 值得注意的是,这种情况并不少见——结果的并行处理几乎可以保证它们会按照可用的顺序返回,除非指定了 ORDER BY
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 2013-11-17
  • 2010-09-15
  • 2010-09-06
相关资源
最近更新 更多