为什么即使使用ORDER BY子句,SQL查询也会返回未排序的行?

时间:2013-04-12 18:48:31

标签: sql sql-server-2008-r2 sql-order-by

我读过的所有内容都说这不应该发生,但它会发生。我的数据库大小约为15GB,几百个表,表可以有几行到几百万。

以下是发生的事情:假设我有一个名为orders的表,第一列名为ID,并且是表的主键。还有许多其他列,其中一列名为policy。如果我运行以下查询:

SELECT * 
FROM orders 
WHERE policy = 12345 
ORDER BY ID

我希望结果看起来像这样:

1
2
3
4
5
6

但有时候结果会是这样的:

1
2
4
5
3
6

好像3被移到了不同​​的位置。怎么/为什么会发生这种情况?

实际查询是

SELECT * FROM loc_info WHERE PolInfo_ID=25634 ORDER BY LocInfo_ID

表定义是

CREATE TABLE [dbo].[loc_info]( 
    [LocInfo_ID] [int] IDENTITY(1,1) NOT NULL, 
    [PolInfo_ID] [int] NOT NULL, 
    [name] [varchar](100) NOT NULL, 
    [address1] [varchar](100) NULL, 
    [address2] [varchar](100) NULL, 
    [city] [varchar](100) NULL, 
    [state] [varchar](100) NOT NULL, 
    [zip] [char](10) NULL, 
    [county] [varchar](100) NULL, 
    [country] [varchar](100) NULL, 
    [loc_number] [varchar](20) NULL, 
    [occ_type_id] [int] NULL, 
    [occ_type] [varchar](100) NULL, 
    [flood_zone] [varchar](6) NOT NULL, 
    [coastal_zone] [varchar](20) NOT NULL, 
    [earthquake_zone] [varchar](20) NOT NULL, 
    [earthquake_group] [varchar](20) NULL, 
    [BuildingTIV] [numeric](18, 0) NULL, 
    [MachEquipTIV] [numeric](18, 0) NULL, 
    [StocksSuppliesTIV] [numeric](18, 0) NULL, 
    [OtherTIV] [numeric](18, 0) NULL, 
    [BusinessInterruptTIV] [numeric](18, 0) NULL, 
    [ExtraExpTIV] [numeric](18, 0) NULL, 
    [RentTIV] [numeric](18, 0) NULL, 
    [Property] [numeric](18, 0) NULL, 
    [IsUpload] [bit] NULL, 
    [IsMoved] [bit] NULL, 
 CONSTRAINT [PK_locations] PRIMARY KEY CLUSTERED  
( 
    [LocInfo_ID] ASC
)WITH (PAD_INDEX  = OFF
, STATISTICS_NORECOMPUTE  = OFF
, IGNORE_DUP_KEY = OFF
, ALLOW_ROW_LOCKS  = ON
, ALLOW_PAGE_LOCKS  = ON
, FILLFACTOR = 90) ON [PRIMARY] 
) 

2 个答案:

答案 0 :(得分:9)

这应该是不可能的,假设您订购的列实际上是LocInfo_ID,它确实是INT,并且您确实有ORDER BY条款到位当问题发生时。

如果您可以在这三个条件成立的情况下生成有效的复制品,那么您手上就会有一个错误(可能是由于腐败造成的)。

我怀疑这里还有其他变量我们不知道。我的猜测是你正在检查的列不是你订购的列,或者它不是你认为的数据类型,或者当你观察到这个随机的无序结果时,实际上并没有订单使用

向下投票即可,但这非常科学和合乎逻辑 - 除非(a)您没有定义它,否则SQL Server不会弄乱您定义的ORDER BY或(b )你没有以产生预期顺序的方式定义它。鉴于你坚持认为这是一个非常简单的表和一个非常简单的顺序,它只是间歇性地发生,我必须同意JNK并说你在SQL Server中发现错误的机会非常小确实

答案 1 :(得分:0)

你试过ORDER BY LocInfo_ID desc吗?只是为了确保它正在被排序的LocInfo_ID?那么3会不会是不合适的?似乎有一些想法(包括我的)将此查询嵌入到其他内容中或作为CTE或TVF的一部分包含在内 - 您还没有上传执行计划。