【问题标题】:Bulk update using multiple joins in postgres在 postgres 中使用多个连接进行批量更新
【发布时间】:2017-10-27 03:18:09
【问题描述】:

希望你们都做得很好!

我正在尝试使用多个连接对表运行批量更新,但我无法这样做。

我有 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        |

我想达到的结果:我想根据以下 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 表中的数百万条记录执行此操作

请帮助/建议!

【问题讨论】:

标签: sql postgresql


【解决方案1】:

我可以通过下面的 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. 可以独立运行并且可以安全地插入(即无论何时插入/删除范围)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2012-09-18
    • 2012-09-18
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多