2017-05-26 8 views
0

あなたは皆がうまくやってくれることを願っています!ポストグルで複数の結合を使った一括更新

複数の結合を使用してテーブルに対して一括更新を実行しようとしていますが、これを行うことができません。

表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  | 

私は3つのテーブルを持っています最終結果は私が達成しようとしています:私はマス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番目の範囲では実行されません。
  2. 私はそれを行うために様々な方法を試しましたが、満足のいく結果を出すものはありませんでした。

IMP私はpricesテーブル内のレコードの数百万人のためにこれをやってます

助けてください/アドバイスを!

+0

可能な重複(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. が独立して実行することができ、への安全がプラグインさ(すなわち範囲が挿入されるたびに/削除)[もう一つの分野から一つのテーブルのSQL更新フィールド]の
関連する問題