【问题标题】:Changing the select list affects the records selected更改选择列表会影响选择的记录
【发布时间】:2016-02-17 01:41:17
【问题描述】:

我有一个查询如下...

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 列中的值组合实际上并不存在于数据库的任何行中。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢。您的回答不仅解释了我所看到的,而且还帮助我认识到,我认为返回的所有行都不存在的论点是谎言。
    • 我明白你的意思。所以按 col2,col3 order by 的分区应该是 col1 对吗?我只是自己尝试过,发现无论我尝试了多少次,它都是由 col1 订购的。数据库中有一些默认顺序吗?
    • @Raffaello.D.Huke 。 . .在某些情况下,SQL Server 可能会以特定顺序处理事物(例如,如果 col1col2col3 在索引中)。但没有任何保证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多