【问题标题】:Order of rows returned by a query in different schema is different不同模式中查询返回的行顺序不同
【发布时间】:2014-08-24 07:49:29
【问题描述】:

我使用的是 Oracle 数据库 10g 企业版 10.2.0.3.0 - 64 位。 我已经创建了一些日期并将其插入到带有字段的表“转移”中

tsid(数字,主键), 名称(varchar 2(20)), desc(varchar 2(30)), 数量(数量), 日期(时间戳)。

我有另一个架构 SHE 具有相同的表和字段。 我使用以下查询将数据复制到 SHE 架构,

    INSERT INTO SHE.TRANSFERS ( SELECT * FROM HE.TRANSFERS );

在模式 HE 和 SHE 中查询表时,我得到的日期顺序不同。

    select * from transfers;

我应该怎么做才能在两个架构中以相同的顺序获取行?

请解释一下数据库行排序。

【问题讨论】:

  • 在 SQL 中,查询的结果没有定义的顺序,除非有 ORDER BY 子句。数据库没有义务在没有 ORDER BY 的情况下以任何特定顺序返回行。事实上,同一查询的不同执行顺序可能不同。
  • 我的回答是否解决了您的问题?你能把它标记为接受吗?谢谢:)
  • 是的,很简单。我们可以通过 tsid 使用 order 来解决这个问题。但我的问题是为什么不同的模式会返回以不同顺序排列的相同数据。如果我想将数据复制到另一个模式表以获得相同的顺序,我应该怎么做。我的情况是我无法在 select 语句中添加 order by。如果我能这样做就更好了INSERT INTO SHE.TRANSFERS ( SELECT * FROM HE.TRANSFERS ORDER BY TSID );
  • @JimGarrison 正如您所说,不同执行的顺序可能不同,我多次尝试选择该选项。但是当我在一个模式中执行时,我得到了相同的顺序。请注意,我没有使用 order by 子句
  • 我重复一遍:数据库不需要以任何顺序返回行,除非您指定“ORDER BY”。 SQL的操作就是这样定义的。 “数据库中”的行没有顺序。您在查询时指定您想要的内容。省略 ORDER BY 告诉数据库您不在乎。由于底层实现,您得到看起来像特定订单的东西这一事实是巧合。在任何情况下你都不能依赖它。

标签: sql database oracle10g database-schema


【解决方案1】:

您需要使用ORDER BY 并选择将代表订单的列。如果您没有请求,则不会以任何特定方式订购查询结果。这就是 SQL 的工作原理......

【讨论】:

  • 有什么办法可以在不修改选择查询的情况下解决这个问题。
  • @smartkid 您可以创建一个执行 ORDER BY 的视图 - 并从视图中选择
【解决方案2】:

ROWID 与 Oracle 中行的顺序之间存在关系。

正如Oracle Documentation Link 中所述,行 ID 在表级别上是唯一的。但是,正如我的朋友在下面的 cmets 中提到的,如果您未指定 Order by clause,则不能保证行的顺序与 RowId 顺序相同。我知道的一个原因是:

如果您使用的是 Index,则索引表中的 RowID 会有所不同,因此在这种情况下按 ROWID 排序 [可能] 会为您提供不同的数据“未索引选择,或者如果使用不同的索引集”。

测试 RowID 顺序:

如果您尝试使用以下语句:SELECT MIN(ROWID) FROM YOUR_TABLE A,它将为您提供插入表中的第一个 ROWID。

这解释了为什么您插入的数据顺序可能与您从中选择此数据的表不同。

见下图:

【讨论】:

  • 默认没有定义顺序。数据可能会按照它在数据库中物理存在的顺序返回(这就是为什么我假设您打算引用ROWID,它是行的物理地址)。但不能保证这一点。
  • @JustinCave,ROWID 与表格中行的顺序有某种关系,但正如你所说,没有必要退出,请参阅this link
  • ROWID 不强加(或暗示)任何排序。它只是行的物理地址。甚至 when 查询使用的索引并不意味着任何排序。异步 I/O、多块读取、不同会话之间的同步扫描以及许多其他因素将改变检索行的顺序。 SELECT MIN(ROWID) FROM YOUR_TABLE A不会为您提供“插入的第一个 ROWID”。它将为您提供具有最低 物理地址 的行。那很可能是插入的“最后一行”。或插入的第 42 行。或已更新的 365373 行。
  • 再次:索引的使用对返回的行的顺序有任何影响
  • 还有一点,你是说SELECT MIN(ROWID) 不会给出第一个插入的行,好吧,根据Oracle Documentation here,你的说法是不正确的。引用链接:行在数据块中的位置(第一行为0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
相关资源
最近更新 更多