执行UPDATE语句时遇ORA-01427错误,求库存扣减正确SQL写法
解决ORA-01427错误并实现正确库存扣减的SQL语句
我有两张表ISSUENCE和SKLAD,需要编写SQL语句从SKLAD表的总库存数量中扣除ISSUENCE表中已发放的物品数量,但编写的UPDATE语句报错ORA-01427(单行子查询返回多行)。
尝试的错误语句
第一条语句(报错ORA-01427)
UPDATE sklad SET item_quantity = item_quantity - (SELECT issue_quantity FROM issuence) WHERE item_id = (SELECT sklad_item_id from issuence);
错误原因:两个子查询都返回了多行结果,而单行赋值操作只能接受单个值,触发ORA-01427错误。
第二条语句(错误扣减库存)
UPDATE sklad SET item_quantity = item_quantity - ( SELECT issue_quantity FROM issuence WHERE issuence.sklad_item_id = sklad.item_id ) WHERE EXISTS ( SELECT 1 FROM issuence WHERE issuence.sklad_item_id = sklad.item_id );
错误原因:若某个物品在ISSUENCE表中有多条发放记录,该语句仅会扣除其中一条的发放数量,无法累计总发放量,导致库存扣减不完整。
表结构
ISSUENCE表
| 字段名 | 类型 | 说明 |
|---|---|---|
| issue_id | NUMBER | 发放记录ID(主键) |
| sklad_item_id | NUMBER | 关联SKLAD的item_id |
| issue_quantity | NUMBER | 单条发放数量 |
| issue_date | DATE | 发放日期 |
SKLAD表
| 字段名 | 类型 | 说明 |
|---|---|---|
| item_id | NUMBER | 物品ID(主键) |
| item_name | VARCHAR2 | 物品名称 |
| item_quantity | NUMBER | 当前库存数量 |
正确的库存扣减语句
需要先按物品分组统计总发放量,再关联SKLAD表完成扣减,以下两种方案都可以实现:
方案1:带聚合的关联子查询
UPDATE sklad s SET s.item_quantity = s.item_quantity - ( SELECT SUM(i.issue_quantity) FROM issuence i WHERE i.sklad_item_id = s.item_id ) WHERE EXISTS ( SELECT 1 FROM issuence i WHERE i.sklad_item_id = s.item_id );
通过SUM(i.issue_quantity)统计单物品的总发放量,确保多条发放记录的数量被累计扣除。
方案2:MERGE批量更新(性能更优)
MERGE INTO sklad s USING ( SELECT sklad_item_id, SUM(issue_quantity) total_issued FROM issuence GROUP BY sklad_item_id ) i ON (s.item_id = i.sklad_item_id) WHEN MATCHED THEN UPDATE SET s.item_quantity = s.item_quantity - i.total_issued;
先预统计所有物品的总发放量,再批量匹配更新SKLAD表,数据量较大时比子查询效率更高。
内容的提问来源于stack exchange,提问作者user20743167
相关产品推荐
相关产品推荐

