SQL - 聚合可能不会出现在UPDATE语句的集合列表中

时间:2016-11-23 08:02:27

标签: sql sql-server tsql sql-merge

大家好,祝大家好。你能帮我纠正这个SQL序列吗?

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,但是记不得太多,所以任何帮助都得到了很大的帮助。

1 个答案:

答案 0 :(得分:2)

错误是因为AccessDate,源语句的选择列列表中的AccessCount没有按列表显示:

    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);