数据输出正确但行位置在PL / SQL Developer中发生变化

时间:2015-07-28 06:56:27

标签: plsqldeveloper

我正在PL / SQL Developer工具中运行一个大的SQL查询(我能够展示)。在我的本地数据库和UAT服务器数据库中输出数据是正确的。但问题是为什么本地数据库的行位置与UAT服务器数据库不同。

本地数据库严格限制:

          PID  Termination_Date   Hire_Date</b>

第1行&gt; 001 2013/07/01 2012/07/01
第2行。 001 2014/01/01

UAT DB i:

第1行 - &gt; 001 2014/07/01
row2 - &gt; 001 2013/07/01 2012/07/01

如果我们认为本地数据库行1在UAT数据库中位于第二位置。 注意:- 我正在为相同的员工ID运行相同的SQL查询。

2 个答案:

答案 0 :(得分:0)

您可以通过在查询中添加ORDER BY子句来修复它,因此无论您在何处执行查询,结果都是相同的。

答案 1 :(得分:0)

这不是问题:它是一个特征。如果你没有通过使用“order by ...”明确要求特定的行排序(并且我理解你没有这样做),你告诉oracle: “看,oracle我真的不关心结果顺序,我只是希望你以最快的方式检索这些行” 而这正是它的作用。如果您在没有要求的情况下获得了希望的订单,那么您只是非常幸运。  为了过度简化它,想象一下oracle只能通过执行全表扫描来检索数据:在这个假设的情况下,如果没有order by子句,您将按照它们物理存储在数据库文件中的确切顺序获取行。你无法预测这个订单!您可能认为此顺序与行在数据库中插入行的顺序一致,但只有在某一点之后才会出现这种情况:oracle可能决定通过循环曾经被前一行占用的空间来插入新行被删除了。  这只是为了给您一个简单的例子,但还有许多其他因素可以影响休闲结果顺序: Oracle在考虑每个服务器上可能不同的因素时决定查询的“执行计划”:可用内存是一个因素,实际数据统计是另一个因素。  服务器可以决定最佳执行计划是全表扫描,另一个可以决定使用索引。

此外:即使您实际发出“按订单”,相同的查询也会根据发出查询的人使用的CLIENT(非服务器)的国家设置给出不同的结果:不同的国家/地区有不同的关于如何进行字母排序的规则:有人说数字在字母之前,有些则相反。  其他示例:假设您提取一周的数字日期(1..7)并对其进行排序。那么:在欧洲的大多数国家,一周的第一天是星期一,而不是星期天(星期日是最后一天)。  所以:只要你想要一个特定的排序顺序,就必须要求它。并且您必须仔细询问自己,您想要的订单是否会受到执行查询的用户的国家设置的影响:如果您不这样做,如果连接法语版Windows的用户使用该应用程序可能会崩溃(和它可能是一个新的潜在客户,来自一个您不希望销售软件的国家。这个问题会让您失去客户。)