2009-06-09 26 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