2017-05-26 79 views
0

希望大家都做得很好!在postgres中使用多個連接進行批量更新

我想在使用多個連接的表上運行批量更新,但我無法這樣做。

我有3個表:

表1:items

|id|total_price|created_at| 

表2:prices

|id|company_id|item_id|special_price|created_at| 
________________________________________________ 
| 1| 1  | 100 |  20.0 | 2017-01-01| 
| 2| 1  | 101 |  30.0 | 2017-01-01| 
| 3| 1  | 102 |  70.0 | 2017-01-01| 
| 4| 1  | 103 |  90.0 | 2017-01-01| 

表3:ranges

|id|company_id|range_from|range_to|commission_percent| 
______________________________________________________ 
| 1| 1  | 10.0 | 50.0 |  5.0  | 
| 2| 1  | 51.0 | 100.0 |  10.0  | 

END結果,我想實現:我想大規模更新下面SQL基於prices表:

UPDATE prices 
    SET special_price = (
    CASE 
    WHEN (special_price BETWEEN ranges.range_from AND ranges.range_to) AND prices.company_id = ranges.company_id 
     THEN 
     ROUND((special_price + (special_price * commission_percent/100)), 2) 
    ELSE 
     special_price 
    END 
) 
    FROM ranges 
    WHERE prices.company_id = 1 

結果會像下面:

|id|company_id|item_id|special_price|created_at| 
________________________________________________ 
| 1| 1  | 100 |  21.0 | 2017-01-01| 
| 2| 1  | 101 |  31.5 | 2017-01-01| 
| 3| 1  | 102 |  77.0 | 2017-01-01| 
| 4| 1  | 103 |  99.0 | 2017-01-01| 

到目前爲止,限制我運行到:

  1. 它始終運行的第一個範圍已定義,從未執行定義的第二個範圍。
  2. 我嘗試過使用各種方法來做到這一點,但沒有一個能給人滿意的結果。

IMP我將在prices表做這數百萬條記錄

請幫幫忙/指教!

+0

[從另外一個領域一個表的SQL更新域]的可能的複製(https://stackoverflow.com/questions/2763817/sql-update-fields-of-one-table-from-fields-of-another-one) – JGH

回答

0

我能夠通過以下SQL來解決此問題:

UPDATE prices 
    SET special_price = ROUND((special_price + (special_price * ranges.commission_percent/100)), 2) 
    FROM items, ranges 
    WHERE (prices.special_price BETWEEN ranges.range_from AND ranges.range_to) 
    AND prices.company_id = ranges.company_id 
    AND prices.stock_item_id = items.id AND prices.special_price = items.total_price 
    AND prices.company_id = 'XX'; 

使用該SQL的優點是:

  1. 它只會更新special_price的取值範圍是/改變。
  2. 超快速的響應時間
  3. 能獨立和安全運行插入式(即每當範圍插入/刪除)