Sql 在postgres中使用多个联接进行批量更新
希望你们都做得很好 我正在尝试使用多个联接对表运行批量更新,但无法执行此操作 我有三张桌子: 表1: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
项目
|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的优点是:
它只会更新范围发生变化的特殊价格
超快速响应时间
可独立运行并安全插入(即插入/删除范围时)
可能重复的