更改选择列表会影响所选记录

时间:2016-02-17 01:41:18

标签: sql sql-server sql-server-2008

我的查询如下......

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 个答案:

答案 0 :(得分:1)

您尚未在col1partition by中加入order by。所以,我的猜测是你有多行,其中col2col3具有相同的值(col1中的值不同)。

在SQL中,排序不稳定 - 也就是说,具有相同键的行可以按任何顺序出现。当您运行两次相同的查询时,这甚至是正确的。而且,这就是你所见证的;只是排序不稳定。

不稳定的排序使SQL中的完美感觉。表格代表无序集合,因此没有"自然"在键具有相同值时使用的排序。

如果您想要稳定排序,请在order by中添加其他列;例如,如果您包含col1,则每次运行查询时都会得到相同的结果。