【问题标题】:Oracle SQL: Merge some rows with specific same columnsOracle SQL:合并某些具有特定相同列的行
【发布时间】:2014-09-21 23:01:36
【问题描述】:

我有一个这样设置的表:

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

【问题讨论】:

  • 查看数据库规范化,您不能在表中存储聚合值。

标签: sql oracle merge


【解决方案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 组合都是唯一的。但这不会出错,它只会给你错误的结果。

【讨论】:

    【解决方案2】:

    对我来说,这听起来像是您只想进行更新。为什么 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 的一行开始。或许将其设为您表上的唯一索引?

    【讨论】:

    • 不,这不仅仅是一次更新。这是一个特殊情况,其中有人插入具有相同供应商和相同类型的书籍。它不是应用拒绝插入的约束,而是将插入的行“合并”到具有相同 id_vendor、相同 isbn 和相同 type_id 的另一行,以我之前展示的方式设置金额和价格。
    • 如果一个新的记录来了怎么办?根据这个逻辑,它既不会更新也不会插入。
    • 是的,在这种情况下,它将是一个 MERGE 语句,如下面的答案。
    猜你喜欢
    • 2012-07-12
    • 2022-11-20
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    相关资源
    最近更新 更多