【问题标题】:ROW_NUMBER() OVER() returns the wrong order when used in a nested SQL DB2 queryROW_NUMBER() OVER() 在嵌套 SQL DB2 查询中使用时返回错误的顺序
【发布时间】:2015-02-25 08:17:44
【问题描述】:

我希望下面的查询删除此选择查询返回的相同行:

 select emp_id, row_number(), over() as row_num from employee order by date_z desc

删除查询:

 delete from ( select emp_id, row_number(), over() as row_num from employee order by date_z desc ) where row_num < 100 

但是当嵌套查询时,row_num 的顺序完全颠倒了。 所以,我最终删除了最后 100 行而不是前 100 行。

对我有用的可能解决方案是:

 delete from ( select emp_id, row_number(), over(order by date_z desc) as row_num from employee order by date_z desc ) where row_num < 100 

但我浏览的大多数网络链接都表明,将 order by 子句放在 over 并不能确保正确的顺序。实现这一目标的正确方法是什么?

【问题讨论】:

  • 仅供参考,当 where 子句从查询中删除时,顺序会变好。

标签: db2 sql-order-by rownum


【解决方案1】:

不妨试试

delete from
(select emp_id from employee order by date_z desc fetch first 100 rows only)

不需要为行编号。

编辑:根据 9.7 LUW found here 的官方文档,您使用 over(order by date_z desc) 的方法也是正确的。

【讨论】:

  • 不,我的用例有点不同。无论总行数如何,我都想在保留前 100 行后删除所有行。因此,如果有 x 行,我想删除 (x-100) 行,以便删除的行是日期最早的行。这是我的实际查询: delete from ( select emp_id, row_number(), over() as row_num from employee order by date_z desc ) where row_num > 100. 如果将 order 子句放在 over() 中在概念上是正确的,我现在想方法,因为这给了我正确的结果
  • @u009988 Official documentation for 9.7 LUW 似乎表明这是正确的方法。您没有指定您正在使用的版本,但至少对于其他 LUW 版本应该是相同的
猜你喜欢
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2021-11-27
  • 2023-04-09
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多