Sql 在postgres中使用多个联接进行批量更新

Sql 在postgres中使用多个联接进行批量更新,sql,postgresql,Sql,Postgresql,希望你们都做得很好 我正在尝试使用多个联接对表运行批量更新,但无法执行此操作 我有三张桌子: 表1:项目 |id|total_price|created_at| 表2:价格 |id|company_id|item_id|special_price|created_at| ________________________________________________ | 1| 1 | 100 | 20.0 | 2017-01-01| | 2| 1

希望你们都做得很好

我正在尝试使用多个联接对表运行批量更新,但无法执行此操作

我有三张桌子:

表1:
项目

|id|total_price|created_at|
表2:
价格

|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:
范围

|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大规模更新
价格
表:

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
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';
结果如下:

|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|
到目前为止,我遇到的限制是:

  • 它始终在定义的第一个范围内运行,从不在定义的第二个范围内执行
  • 我试着用各种方法来做这件事,但没有一种能得到令人满意的结果
  • IMP I将对
    价格表中的数百万条记录执行此操作


    请帮助/建议

    我通过下面的SQL解决了这个问题:

    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
    
    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的优点是:

  • 它只会更新范围发生变化的特殊价格
  • 超快速响应时间
  • 可独立运行并安全插入(即插入/删除范围时)
  • 可能重复的