我有一个以这种方式设置的表:
ID_VENDOR ISBN TYPE_ID AMOUNT PRICE
> 6317 9788807884245 2001 2 2,99
> 6317 9788808148070 2001 2 8,99
我希望每次添加具有相同ID_VENDOR,ISBN和TYPE_ID的行时,这两行都如下例所示:
6317 9788808148070 2001 2 8,99
6317 9788808148070 2001 1 7,99
将合并为像这样的唯一行:
6317 9788808148070 2001 3 7,99
将AMOUNT汇总并且PRICE将在插入最后一个价格时更新。例如,如果我以这种方式插入两行以上:
6317 9788808148070 2001 2 8,99
6317 9788808148070 2001 1 7,99
6317 9788808148070 2001 3 7,50
这三行将像这样合并
6317 9788808148070 2001 6 7,50
我尝试过“MERGE”,但它给了我一些重复的麻烦。我该怎么办?
答案 0 :(得分:1)
这似乎是一个相当直接的合并:
merge into books b
using (select 6317 as id_vendor, 9788808148070 as isbn, 2001 as type_id,
1 as amount, 7.99 as price from dual) n
on (n.id_vendor = b.id_vendor and n.isbn = b.isbn and n.type_id = b.type_id)
when matched then
update set b.amount = b.amount + n.amount, b.price = n.price
when not matched then
insert (id_vendor, isbn, type_id, amount, price)
values (n.id_vendor, n.isbn, n.type_id, n.amount, n.price);
SQL Fiddle使用相同的merge
初始填充和所有后续更改,只更改固定值。
不确定为什么重复会给你带来麻烦;除非您的现有数据可能已经有多行用于相同的值?如果是这种情况,那么您需要在开始使用此数据之前清理现有数据,以便每个vendor_id
,isbn
和type_id
组合都是唯一的。但这不会出错,只会给你错误的结果。
答案 1 :(得分:0)
对我而言,听起来你只是想做一个更新。为什么INSERT然后尝试聚合数据?这似乎太复杂了。
UPDATE vendor_table
SET amount = amount + new_amount,
price = new_price
WHERE id_vendor = my_vendor_id
isbn = my_isbn
type_id = my_type_id;
这假设您只从每id_vendor
,isbn
和type_id
开始。也许在你的桌子上做一个独特的索引?