2016-11-23 2 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 - сумма счетчиков в группе.

Если подходящие записи не найдены, просто вставьте. Я работал с SQL, как 2 года назад, но не могу много помнить, чтобы любая помощь была оценена.

ответ

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

Работал как шарм. Спасибо! –

+0

Другая проблема возникла после того, как я обновил заявление. 'Невозможно вставить повторяющуюся строку ключа в объект 'dbo.table2''. Из-за оператора 'INSERT'' КОГДА НИКАКОГО НЕ СООТВЕТСТВУЕТ' –

 Смежные вопросы

  • Нет связанных вопросов^_^