1

我有几个表,其中一个字段是优先级(1 到 5)。这里的问题是,不同的项目一直使用 5 作为最高,有些使用 1 作为最高,我将对此进行协调。

我的简单选择是创建一个临时表并将数据复制并切换为该表:
1 -> 5
2 -> 4
3 -> 3
4 -> 2
5 -> 1

我对 SQL 不是很好,但感觉应该有一种简单的方法可以通过语句立即关闭这些值,但我确实担心何时有大量数据,如果中途出现问题,那么数据会一团糟。

我应该直接使用我的临时表解决方案,还是应该有一种直接在 SQL 中执行此操作的好方法?(正在使用Oracle 10g)

非常感谢!

4

3 回答 3

13

只需像这样更新第二个表,不需要临时表,因为您只是颠倒优先级:

update table_2
set priority = 6-priority;
于 2009-06-09T11:38:38.567 回答
4

您可以使用 CASE 语句

case PRIORITY
  when 5 then 1
  when 4 then 2
  when 3 then 3
  when 2 then 4
  when 1 then 5
  else PRIORITY
end

编辑:texBlues 的解决方案要好得多,但我把它留在这里,用于数学不那么整洁的情况。

于 2009-06-09T11:41:47.140 回答
0

为确保更新出错时不会出现“混乱”结果,请使用事务。基于 tekBlues 解决方案(为此 +1)。

START TRANSACTION;

update table_2
set priority = 6-priority;

...

COMMIT;

如果您想一次更新多个表,这尤其有效。正如 hainstech 在他的评论中正确指出的那样,单个语句被隐式处理。

于 2009-06-09T11:43:15.437 回答