2014-09-24 144 views
0

记录结果为了我有这个疑问:差异对同一查询

SELECT -- some columns -- 
FROM ABC 
    INNER JOIN DEF ON DEF._VALUE = SUBSTRING(ABC._VALUE, 1, 6) 
    INNER JOIN GHI ON GHI.CODE = DEF.CODE 
    LEFT OUTER JOIN DC ON DC.PAN = ABC.PAN 
    LEFT OUTER JOIN BR ON BR.NAME = DC.NAME 
WHERE ABC.RECEIVED_DATE >= CONVERT(DATETIME,'2014-01-01 00:00:00',120) 
     AND ABC.RECEIVED_DATE <= CONVERT(DATETIME,'2014-01-10 23:59:59',120) 
     AND ('-1' IN ('-1') OR ABC.ID IN ('-1')) 
     AND ('-1' IN ('2012') OR BR.NAME IN ('2012')) 
     AND ABC.PAN LIKE '%' + '%' + '%' 
     AND DC.RL LIKE '%' + '%' + '%' 
     AND (ABC.RC = '1') 

每次它击中它得到的记录相同数量(比如15),但记录的顺序数据库时不同的是每时间。如果在第一次尝试中显示为记录#-1的记录显示在第二次尝试中的记录#-6可能是。换句话说,订单受到干扰(每次订单不一致)。

可能的原因是什么?由于索引或什么?我不确定这是为什么。引导我请

+0

确定..但是,当我只是想:SELECT * FROM ABC。它不会随机给我记录,只要我没有明确地在这种情况下使用ORDER BY。 – Sadiq 2014-09-24 09:20:50

+2

阅读此:如果你**需要**订购 - 你**必须**指定一个'订单BY' - 就这么简单。没有'ORDER BY' ---> ** NO **(有保证)订购 – 2014-09-24 09:21:49

回答

3

既然你没有指定明确的ORDER BY条款,有没有订购(这是任何RDBMS的默认行为)。

无论数据库引擎如何,数据都以任何方式返回。这可能看起来订购 - 但不能保证 - 下次运行查询时(不含ORDER BY),您的结果返回可能会以不同的顺序

如果您需要订购 - 您必须指定ORDER BY条款!

见亚历山大·库兹涅佐夫这篇博客Without ORDER BY, there is no default sort order其中包含证明了这一事实一个不错的简单的摄制脚本 - 没有ORDER BY ==没有默认排序....

+1

请亲自尝试:[例1](http://gvee.co.uk/files/sql/Expecting%20order%20without%20ORDER% 20BY%20(1).sql),[示例2](http://gvee.co.uk/files/sql/Expecting%20order%20without%20ORDER%20BY%20(2).sql),[示例3 ](http://gvee.co.uk/files/sql/Expecting%20order%20without%20ORDER%20BY%20(3).sql) – gvee 2014-09-24 11:43:27

+0

@gvee:谢谢 - 但这应该证明什么?你有没有看过Alex Kuznetsov的样本我链接到? – 2014-09-24 13:19:43

+1

嗨@mar​​c_s,是的,我之前见过Alex的例子。这些仅仅是为什么你不能在不指定'ORDER BY'的情况下预期订单的小例子。附:评论不是针对你,而是针对未来的读者。 – gvee 2014-09-24 13:53:29