我的查询如下......
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列中的值组合实际上并不存在于数据库的任何行中。
我是否疯了,发现了一个或更多的错误,我是否误解了它应该如何运作?
答案 0 :(得分:1)
您尚未在col1
或partition by
中加入order by
。所以,我的猜测是你有多行,其中col2
和col3
具有相同的值(col1
中的值不同)。
在SQL中,排序不稳定 - 也就是说,具有相同键的行可以按任何顺序出现。当您运行两次相同的查询时,这甚至是正确的。而且,这就是你所见证的;只是排序不稳定。
不稳定的排序使SQL中的完美感觉。表格代表无序集合,因此没有"自然"在键具有相同值时使用的排序。
如果您想要稳定排序,请在order by
中添加其他列;例如,如果您包含col1
,则每次运行查询时都会得到相同的结果。