【问题标题】:SQL - Insert or Update with a result from another tableSQL - 使用另一个表的结果插入或更新
【发布时间】:2016-12-19 00:10:49
【问题描述】:

我有两个表DailyVisitsTotalSum 我的目标是使用存储过程/查询将DailyVisits 添加到TotalSum,我将在一天结束时运行。

DailyVisits
UserId,PageId,Visits
1,1,32
2,123,34
4,12,213
5,1,1

TotalSum
UserId,PageId,TotalVisits
1,1,300
1,41,2
3,12,213
5,1,653

等等。

我尝试了两种方法,但无法找到解决方案。

在我的查询下,如果您有其他简单易懂的建议/查询,感谢您的帮助。

方法1:

delimiter $$
CREATE PROCEDURE UPSERT_DAILYSUM()
BEGIN
    IF EXISTS (SELECT Id, PageId FROM DailyVisits) THEN
        UPDATE TotalSum TotalVisits = TotalVisits + (SELECT Visits FROM DailyVisits);
    ELSE INSERT INTO TotalSum (UserId,PageId,TotalVisits) 
                         VALUES (SELECT Id,PageId,Visits);
    END IF
END $$
delimiter ;

方法2:

INSERT INTO TotalSum (UserId,PageId,TotalVisits) VALUES(SELECT * FROM DailyVisits)
 ON DUPLICATE KEY UPDATE (PageId,TotalVisits) 
               VALUES(SELECT PageId,Visits FROM DailyVisits)

这就是我正在努力解决的问题:当键不存在时,我将如何获得不同的值?我可以使用RIGHT JOIN(或LEFT JOIN)并检查NULL 值,然后添加右(或左)表吗?

【问题讨论】:

  • 哦,是的!我从来没有想过分别做两个更新和插入。谢谢!
  • 如果我的回答对你有帮助,请给我点赞
  • 是的,当您构建一个好的触发器来执行此操作时,可能会发生这种情况。同时插入然后更新或插入到另一个表。
  • 与事件相同.. SP 与事件

标签: mysql sql insert sql-update insert-update


【解决方案1】:

和你需要的一样:

问题是我不知道你想在更新和插入部分做什么:

delimiter $$
CREATE PROCEDURE UPSERT_DAILYSUM()
BEGIN

Declare idvar int(50) DEFAULT 0;
Declare pageidvar int(50) DEFAULT 0;

SELECT Id, PageId INTO idvar,pageidvar  FROM DailyVisits;

if(LENGTH(idvar)>0 THEN
    UPDATE TotalSum TotalVisits = TotalVisits + (SELECT Visits FROM DailyVisits);
ELSE

 INSERT INTO TotalSum (UserId,PageId,TotalVisits)  VALUES (SELECT Id,PageId,Visits);

END $$
delimiter ;

【讨论】:

  • 你想插入什么,你想更新什么。我的意思是什么数据价值。这只是一个例子,让你指导去做。有很多方法可以做到这一点
  • 如果 UserId 和 PageId 匹配,我想获得 Visits 列的运行总和。如果它们不存在,则创建新记录,依此类推。
  • 运行总和是什么意思?每次记录更改的时间?
猜你喜欢
  • 2017-04-12
  • 2019-02-19
  • 2012-12-06
  • 2014-02-23
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多