我有以下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数据库来运行查询。
答案 0 :(得分:1)
如同尼古拉斯·克拉斯诺夫所说,你可以在SQL Fiddle中进行测试。
但是如果你发现自己要在子查询中使用rownum = 1的地方,那么警钟应该会消失,因为在90%的情况下你做错了。您很少需要随机值。仅当所有选定值相同时,rownum = 1才有效。
在这种情况下,我希望calendar_id是日历中的主键。因此,hrs中的每条记录每条记录只能选择1个plan_week_id。所以rownum = 1的位置不是必需的。
并回答你的问题:是的,它会运行得很好。虽然每个where子句的括号也不是必需的,实际上只是令人困惑(我)。