Oracle SQL:合并具有特定相同列的某些行

时间:2014-07-30 10:29:27

标签: sql oracle merge

我有一个以这种方式设置的表:

  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”,但它给了我一些重复的麻烦。我该怎么办?

2 个答案:

答案 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_idisbntype_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_vendorisbntype_id开始。也许在你的桌子上做一个独特的索引?

相关问题