使用ROWNUM选择前n个Oracle记录在子查询中仍然有效吗?

时间:2013-08-28 13:36:26

标签: sql oracle subquery

我有以下FireBird查询:

update hrs h
set h.plan_week_id=
  (select first 1 c.plan_week_id from calendar c
   where c.calendar_id=h.calendar_id)
where coalesce(h.calendar_id,0) <> 0

(意图:对于hrs中带有(非零)calendar_id的记录             取calendar.plan_week_id并将其放入hrs.plan_week_id

在Oracle中选择第一条记录的诀窍是使用WHERE ROWNUM=1,如果理解正确I do not have to use ROWNUM in a separate outer query because I 'only' match ROWNUM=1 - 非常感谢您建议可能已有的问题你的答案; - )

这会使它成为

update hrs h
set h.plan_week_id=
  (select c.plan_week_id from calendar c
   where (c.calendar_id=h.calendar_id) and (rownum=1))
where coalesce(h.calendar_id,0) <> 0

我实际上正在使用“第一条记录”以及仅选择一个字段,以确保我获得一个值,这可以放入{{ 1}}。

问题:以上查询是否会按预期在Oracle下运行?

目前,我手边没有填充的Oracle数据库来运行查询。

1 个答案:

答案 0 :(得分:1)

如同尼古拉斯·克拉斯诺夫所说,你可以在SQL Fiddle中进行测试。

但是如果你发现自己要在子查询中使用rownum = 1的地方,那么警钟应该会消失,因为在90%的情况下你做错了。您很少需要随机值。仅当所有选定值相同时,rownum = 1才有效。

在这种情况下,我希望calendar_id是日历中的主键。因此,hrs中的每条记录每条记录只能选择1个plan_week_id。所以rownum = 1的位置不是必需的。

并回答你的问题:是的,它会运行得很好。虽然每个where子句的括号也不是必需的,实际上只是令人困惑(我)。