2015-12-21 27 views
1

我有N列:A,B,C,... N每個都是十進制(8,2)。 我想寫一個存儲過程,需要一個行ID和一個十進制(8,2)X.如何跨多個列進行級聯遞減

我希望它減少A,直到A達到零或直到它減少了X.如果A達到零和X比A更大,那麼我想通過X - A的原始值來減少B,等等。

例如:

select * from foo_table where id = 0; 

| id| A | B | C |.. 
+---+---+---+---+ 
| 0 | 5 | 3 | 2 | 

call my_stored_proc(0,9); 
select * from foo_table where id = 0; 

| id| A | B | C |.. 
+---+---+---+---+ 
| 0 | 0 | 0 | 1 | 

什麼是這樣做的推薦和高性能的方式?

+0

多少列閱讀更多關於變量你有?它應該是固定的數字 – lad2025

+0

你能告訴我們從每一步到達'0,0,1'的數字進展嗎?可能比您想象的更容易解決問題。 –

+0

無論出現什麼問題,如果使用RDBMS,推薦的和高性能的解決方案將會正常化, – Strawberry

回答

1

鑑於你的樣本數據這個查詢這項工作:

UPDATE t 
JOIN (

    SELECT 
    t.id, 
    GREATEST(A - @a, 0) A, 
    @a := GREATEST(@a - A, 0), 
    GREATEST(B - @a, 0) B, 
    @a := GREATEST(@a - B, 0), 
    GREATEST(C - @a, 0) C, 
    @a := GREATEST(@a - C, 0) 
    FROM 
    t 
    , (SELECT @a := 9) var_init_subquery 
    WHERE id = 0 
    ORDER BY id 

) sq ON t.id = sq.id 
SET t.A = sq.A 
, t.B = sq.B 
, t.C = sq.C;