2016-02-17 52 views
0

我有一个查询如下...更改选择列表中的影响记录选定

select * 
from (select COL1, COL2, COL3, 
        ROW_NUMBER() OVER (PARTITION BY COL2,COL3 ORDER BY COL2,COL3) AS rn 
    from TABLE 
    ) t 
where rn = 1 

它返回预期结果。当我修改外选择明确要求列没有行号列从而...

select COL1, COL2, COL3 from 
from (select COL1, COL2, COL3, 
      ROW_NUMBER() OVER (PARTITION BY COL2, COL3 ORDER BY COL2, COL3) AS rn from TABLE 
    ) t 
where rn = 1 

我得到不同的结果。事实上,返回的COL1,COL2和COL3列中的值的组合实际上不存在于数据库中的任何行中。

我是否疯了,发现了一个错误或更可能,我误解这应该如何工作?

回答

1

您还没有在partition byorder by中包含col1。所以,我的猜测是,您有多行,其中col2col3具有相同的值(以及col1中的不同值)。

在SQL中,排序不稳定 - 也就是说,具有相同键的行可以按任意顺序出现。当您运行相同的查询两次时,情况更是如此。而且,这就是你所见证的;只是这种排序不稳定。

不稳定的排序使完美在SQL中的意义。表格代表无序集合,因此当键具有相同的值时,没有“自然”排序。

如果您想要稳定的排序,请在order by中包含一个额外的列;例如,如果您包含col1,那么每次运行查询时都会得到相同的结果。

+0

非常感谢。你的回答不仅解释了我所看到的,而且还帮助我认识到,我认为没有任何回归的行确实存在就是谎言。 – Glen

+0

我明白你的意思。所以分区由col2,col3命令应该是col1对吗?我只是自己尝试过,无论我尝试过多少次,都发现它只是由col1订购。数据库中是否有默认的订单? –

+0

@ Raffaello.D.Huke。 。 。有些情况下SQL Server可能会按特定的顺序处理事物(例如,如果'col1','col2'和'col3'在索引中)。但是没有保证。 –