Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL:将某些行与特定的相同列合并_Sql_Oracle_Merge - Fatal编程技术网

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语句,如下所示。