SQL:更新请求 - 根据列总和行数,删除旧副本

时间:2017-06-28 15:51:10

标签: sql sql-server

问题

我有以下情况: 当我的网站上的用户没有登录时,他可以将产品添加到购物车。但当他点击“购买”时在购物车信息页面的按钮,他应该登录进行结帐并完成订单。这是这里的主要逻辑......

所以想象一下,用户有2个产品但尚未登录(他已在网站上拥有帐户)。然后,他将登录,并且他已经拥有完全相同的2个产品,但数量不同。

:定位:

我想在shopcart表中提供类似产品的总和,然后删除类似产品的副本。

Sql表

Id            Qt    user_id    outer_user_id

product-1     1       22            NULL
product-1     3       NULL          45
product-2     1       NULL          45
product-2     2       22            NULL
product-2     5       27            NULL

当用户刚刚登录时,我想要以下结果:

Id            Qt   user_id     outer_user_id

product-1     4      22            NULL
product-2     3      22            NULL
product-2     5      27            NULL

-- outer user with outer_user_id = 45 will login as inner user with user_id = 22

如您所见,我想从多个相似的产品中创建独特的产品,并总结其数量。如何在SQL Server数据库中执行请求? 谢谢!

注意:查询应该更新表并删除一些行,而不是选择结果。

1 个答案:

答案 0 :(得分:4)

以下是代码段:使用更新语句和CTE删除重复记录。我只按id分组,但对于您的情况,您需要按user_id和product_Id分组

 Create table #temp(id int , dvalue int)

Insert into #temp(id,dvalue) values(1,10)
Insert into #temp(id,dvalue) values(1,2)
Insert into #temp(id,dvalue) values(1,3)
Insert into #temp(id,dvalue) values(2,10)
Insert into #temp(id,dvalue) values(2,1)
Insert into #temp(id,dvalue) values(2,1)

select * from #temp

Update t1 set t1.dvalue=(select sum(dvalue) from #temp t group by id having 
t.id=t1.id) from #temp t1;

WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY id order by dvalue) AS RN
FROM #temp
)

DELETE FROM CTE WHERE RN<>1

我刚刚使用了其他一些表和列名 - 希望它可以帮助你。