在表中组合行

yzxexxkh  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(330)

我有购物车和物品表如下

Cart
+---------+-------------+
| cart_id | customer_id |
+---------+-------------+
|       1 |           1 |
|       2 |           2 |
+---------+-------------+

Item
+---------+---------+------------+------------+
| item_id | cart_id | product_id |   quantity |
+---------+---------+------------+------------+
|       1 |       1 | AAAA       |          7 |
|       2 |       1 | BBBB       |          2 |
|       3 |       2 | AAAA       |          5 |
|       4 |       2 | CCCC       |          3 |
+---------+---------+------------+------------+

我想写一个查询,将一个购物车中的项目添加到另一个购物车。例如,将cart2中的项目转换为cart1。在这个查询之后,表的内容应该是这样的

Item
+---------+---------+------------+------------+
| item_id | cart_id | product_id | product_id |
+---------+---------+------------+------------+
|       1 |       1 | AAAA       |          5 |
|       2 |       1 | BBBB       |          2 |
|       4 |       1 | CCCC       |          3 |
+---------+---------+------------+------------+

表有这样的输出,因为加法的工作方式如下
产品aaaa同时存在于cart1和cart2中,因此cart1更新数量=5表示item1,cart2删除item3
项2未更改,因为cart2中没有此类项
cart1中没有product\u id=cccc的项目,因此它将item4的cart\u id更改为cart1
应删除cart2,因为cart2中的项合并到cart1中

iq3niunx

iq3niunx1#

虽然您的论点“我不需要插入新值…”可能是正确的,但@gordonlinoff提供的插入过程比设计的任何更新都要简单得多,因此可能更容易理解。然而,缺少的是从两个表中删除现在已停用的购物车。可以通过级联cte(?)或sql函数来处理。因为我不关心级联dml cte,所以我将提供一个函数。

create or replace function merge_carts(from_cart integer, to_cart integer)
  returns void
  language sql 
as $$
   insert into item(cart_id,product_id,quantity)
     select to_cart, product_id, quantity
       from item   
      where cart_id = from_cart
         on conflict (cart_id,product_id)
         do update set quantity = excluded.quantity; 
   delete 
     from item
    where cart_id = from_cart; 
   delete 
     from cart
    where cart_id = from_cart;            
$$;

一旦我知道了涉及的cart\u id,我就调用merge\u carts函数。
关键的问题是你要确保你的“匿名用户”被识别为客户2实际上是客户1。
请参阅此处的完整案例示例。

aurhwmvo

aurhwmvo2#

我想写一个查询,将一个购物车中的项目添加到另一个购物车。例如,将cart2中的项目转换为cart1。
如果你想做一个“向上插入”--然后 update 以及 insert 在同一语句中--在冲突中使用`on。
以唯一键开始:

alter table item unq_item_cart_product unique constraint (cart_id, product_id);

然后:

insert into item (cart_id, product_id, quantity)
     select 1, product_id, quantity
     from item
     where cart_id = 2
     on conflict (cart_id, product_id)
          do update set quantity = quantity + excluded.quantity;

相关问题