-1

我有以下 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_idcalendar.plan_week_id其放入hrs.plan_week_id

在 Oracle 中选择第一条记录的技巧是使用WHERE ROWNUM=1,如果理解正确,不必在单独的外部查询中使用 ROWNUM 因为我“只”匹配 ROWNUM=1 - 感谢 SO 提出可能的问题已经有了你的答案;-)

这会让它

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

我实际上使用“第一条记录”以及仅选择一个字段来保证我得到一个可以放入的值h.plan_week_id

问题:上述查询在 Oracle 下能否按预期工作?

现在,我手头没有一个填满的 Oracle DB 来运行查询。

4

1 回答 1

1

就像 Nicholas Krasnov 所说,您可以在SQL Fiddle中对其进行测试。

但是,如果您发现自己要在子查询中使用 where rownum = 1,则应该敲响警钟,因为在 90% 的情况下,您做错了什么。您很少需要随机值。只有当所有选定的值都相同时,rownum = 1 才有效。

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

并回答您的问题:是的,它会运行得很好。尽管每个 where 子句周围的括号也不是必需的,实际上只会使人感到困惑(我)。

于 2013-08-28T18:43:05.530 回答