2009-06-09 69 views
1

我有几个表,其中一个字段用于优先级(1到5)。这里的问题是,不同的项目使用5最高和1最高,我会协调这一点。用于切换值的SQL语句

我容易选择是创建一个临时表和数据在复制和开关作为该表:
1 - > 5
2 - > 4
3 - > 3
4 - > 2
5 - > 1

我对SQL并不擅长,但感觉应该有一种简单的方法来将这些值从一个声明中切换出来,但我确实担心何时会有大量数据,以及如果一半出了问题,那么数据就会混乱。

我应该只是去我的临时表解决方案,或者你应该有一个很好的方式,直接在SQL中做到这一点? (正在使用Oracle 10g)

非常感谢!

+1

你说一些项目 - 所以不要忘记在答案中提供的查询中添加一个WHERE子句! – Benjol 2009-06-09 11:52:05

+0

如果您担心解决方案如何工作或者您是否会陷入混乱,首先,不要直接执行解决方案,然后在进行更改之前对数据进行备份。如果你有审计,你可以用它来代替。这样,如果您发现变化不佳,那么变更前的信息总是可以逆转。 – HLGEM 2009-06-09 18:10:43

回答

13

简单地更新第二台这样的,是不是需要一个临时表,因为你只是倒车优先:

update table_2 
set priority = 6-priority; 
+0

好多了。 – nickd 2009-06-09 11:42:49

+0

自从OP声明只有一些被颠倒后,我们不需要where子句吗? – HLGEM 2009-06-09 18:08:40

+0

非常感谢!只是我认为是在那里的解决方案.. – StefanE 2009-06-09 22:16:55

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'解决方案要好得多,但我在这里留下的是数学不够整齐的情况。

0

如果更新出错,请确保没有“混乱”结果,请使用事务。基于tekBlues解决方案(+1)。

START TRANSACTION; 

update table_2 
set priority = 6-priority; 

... 

COMMIT; 

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

+2

我不是一个Oracle用户,但肯定一个单一的语句总是运行在一个隐式或显式的交易,不管? – ahains 2009-06-09 13:18:50