2016-11-23 111 views
2

大家好,祝大家好日子。你能幫我糾正這個SQL序列嗎?SQL - 聚合可能不會出現在UPDATE語句的集合列表中

MERGE INTO table2 WITH (HOLDLOCK) AS target 
USING 
(
    SELECT column1, 
     AccessDate, 
     AccessCount, 
     column4, 
     column5, 
     column6, 
     column7, 
     column8 
    FROM table1 
    GROUP BY column1, column4, column5, column6, column7, column8 
) AS source 
ON target.column1 = source.column1 AND 
    target.column5 = source.column5 AND 
    target.column6 = source.column6 AND 
    target.column7 = source.column7 AND 
    target.column8 = source.column8 
WHEN MATCHED THEN 
UPDATE SET target.LastAccessDate = MAX(source.AccessDate), 
    target.LastWeeklyAccessCount = (SELECT SUM(source.AccessCount)) 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT (column1, LastAccessDate, LastWeeklyAccessCount, column4, column5, column6, column7, column8) 
    VALUES (source.column1, source.AccessDate, source.AccessCount, source.column4, source.column5, source.column6, source.column7, source.column8); 

我得到一個「聚合不應出現在UPDATE語句的集合列表中」錯誤,當我嘗試,因爲這兩條線運行:

target.LastAccessDate = MAX(source.AccessDate), 
target.LastWeeklyAccessCount = (SELECT SUM(source.AccessCount)) 

我的代碼應該將目標AccessDate更新爲組中的AccessDates的最大值,並將LastWeeklyAccessCount更新爲組中計數的總和。

當找不到匹配的記錄時,只需插入即可。我已經和2年前的SQL一起工作過,但記不起太多,所以任何幫助都被誇大了。

回答

2

這個錯誤是因爲AccessDate,AccessCount在源語句的選擇列列表不在GROUP BY列表中出現:

MERGE INTO table2 WITH (HOLDLOCK) AS target 
    USING 
    (
     SELECT column1, 
      MAX(AccessDate) AS AccessDate, 
      SUM(AccessCount) AS AccessCount, 
      column4, 
      column5, 
      column6, 
      column7, 
      column8 
     FROM table1 
     GROUP BY column1, column4, column5, column6, column7, column8 
    ) AS source 
    ON target.column1 = source.column1 AND 
     target.column5 = source.column5 AND 
     target.column6 = source.column6 AND 
     target.column7 = source.column7 AND 
     target.column8 = source.column8 
    WHEN MATCHED THEN 
    UPDATE SET target.LastAccessDate = source.AccessDate, 
     target.LastWeeklyAccessCount = source.AccessCount 
    WHEN NOT MATCHED BY TARGET THEN 
     INSERT (column1, LastAccessDate, LastWeeklyAccessCount, column4, column5, column6, column7, column8) 
     VALUES (source.column1, source.AccessDate, source.AccessCount, source.column4, source.column5, source.column6, source.column7, source.column8); 
+0

工作就像一個魅力。謝謝! –

+0

更新聲明後出現另一個問題。 '不能在對象'dbo.table2'中插入重複的關鍵行。由於'INSERT'語句'WHEN MATCHED' –