2016-08-12 44 views
0

我有兩個表DailyVisitsTotalSum我的目標是將DailyVisits添加到TotalSum,並帶有存儲過程/查詢,我將在一天結束時運行。SQL - 使用其他表的結果插入或更新

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 

等等。

我嘗試了兩種方法,但我無法解決問題。

爲了達到這個目的,在我的查詢下面,如果您有另一個足夠簡單易懂的建議/查詢,我感謝您的幫助。

Approach1:

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 ; 

Approach2:

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值,然後添加右(或左)表嗎?

+1

這是否幫助? http://stackoverflow.com/questions/11883237/insert-or-update-table-from-another-table-with-composite-primary-key – 2016-08-12 04:53:05

+0

哦,是的,它確實!我從來沒有想過要兩次更新並分別插入。謝謝! –

+0

如果我的回答幫助你,請給我一個upvote – 2016-08-12 05:41:49

回答

0

一樣的,你需要這樣的:

問題是我不知道你想在更新做並插入部分內容:

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 ; 
+0

你想插入什麼,你想要更新什麼。我的意思是什麼數據價值。這只是一個例子,讓你有一個指導來做到這一點。有很多方法可以做到這一點 –

+0

如果UserId&PageId匹配,我想獲得Visits列的運行總和。如果它們不存在,則創建新記錄等。 –

+0

你是什麼意思運行總和?每次記錄改變時? –