Oracle SQL:将某些行与特定的相同列合并
我有一张这样的桌子:Oracle SQL:将某些行与特定的相同列合并,sql,oracle,merge,Sql,Oracle,Merge,我有一张这样的桌子: ID_VENDOR ISBN TYPE_ID AMOUNT PRICE > 6317 9788807884245 2001 2 2,99 > 6317 9788808148070 2001 2 8,99 6317 9788808148070 2001 2 8,99 6317 9788808148070 20
ID_VENDOR ISBN TYPE_ID AMOUNT PRICE
> 6317 9788807884245 2001 2 2,99
> 6317 9788808148070 2001 2 8,99
6317 9788808148070 2001 2 8,99
6317 9788808148070 2001 1 7,99
6317 9788808148070 2001 3 7,50
我希望每次添加具有相同ID\u供应商、ISBN和类型\u ID的行时,这两行如本例所示:
6317 9788808148070 2001 2 8,99
6317 9788808148070 2001 1 7,99
将合并为一个唯一的行,如下所示:
6317 9788808148070 2001 3 7,99
将金额相加,并使用插入的最后一个价格更新价格。例如,如果我以这种方式插入两行以上:
ID_VENDOR ISBN TYPE_ID AMOUNT PRICE
> 6317 9788807884245 2001 2 2,99
> 6317 9788808148070 2001 2 8,99
6317 9788808148070 2001 2 8,99
6317 9788808148070 2001 1 7,99
6317 9788808148070 2001 3 7,50
这三行将像这样合并
6317 9788808148070 2001 6 7,50
我尝试过“合并”,但它给我带来了一些重复的麻烦。我该怎么办?对我来说,听起来你只是想更新一下。为什么要插入然后尝试聚合数据?这似乎太复杂了
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\u供应商
,isbn
和类型id
只从一行开始。也许可以将其作为表上的唯一索引?这似乎是一个相当简单的合并:
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);
初始填充和所有后续更改都使用相同的合并
,只需更改固定值
不知道为什么复制品会给你带来麻烦;除非您现有的数据已经有多行相同的值?如果是这种情况,那么您需要在开始使用之前清理现有数据,这样每个
供应商id
、isbn
和类型id
组合都是唯一的。但这不会出错,只会给您错误的结果。请参阅数据库规范化,您不能在表中存储聚合值。不,这不仅仅是更新。这是一种特殊情况,在这种情况下,有人插入一本具有相同供应商和相同类型的书。它没有应用拒绝插入的约束,而是将插入的行“合并”到另一行中,该行具有相同的id\u供应商、相同的isbn和相同的类型\u id,并以我之前显示的方式设置金额和价格。如果出现一条新记录呢?根据这个逻辑,它既不会更新也不会插入。True,在这种情况下,它将是一个MERGE语句,如下所示。