T-SQL MERGE: каждое выражение GROUP BY должно содержать хотя бы один столбец, который не является внешней ссылкой - PullRequest
0 голосов
/ 04 сентября 2018

При использовании SELECT CONCAT(SOURCE.OrderNo, '_', SOURCE.OrderLine), MAX(SOURCE.LastDate) GROUP BY CONCAT(SOURCE.OrderNo, '_', SOURCE.OrderLine) и SELECT CONCAT(TARGET.OrderNo, '_', TARGET.OrderLine), MAX(TARGET.LastDate) GROUP BY CONCAT(TARGET.OrderNo, '_', TARGET.OrderLine) в

MERGE dbo.TargetTbl AS TARGET
USING dbo.SourceTbl AS SOURCE 
      ON (TARGET.OrderNo = SOURCE.OrderNo) 
WHEN MATCHED AND EXISTS (SELECT           CONCAT(SOURCE.OrderNo, '_', SOURCE.OrderLine)
                                         ,MAX(SOURCE.LastDate)
                         GROUP BY         CONCAT(SOURCE.OrderNo, '_', SOURCE.OrderLine)
                         INTERSECT SELECT CONCAT(TARGET.OrderNo, '_', TARGET.OrderLine)
                                         ,MAX(TARGET.LastDate)
                         GROUP BY         CONCAT(TARGET.OrderNo, '_', TARGET.OrderLine)
                        )
THEN UPDATE SET TARGET.IsBlocked = 1;

Я получаю эту ошибку:

Каждое выражение GROUP BY должно содержать хотя бы один столбец, который не является внешняя ссылка.

Я искал и нашел несколько решений, но ни одно из них не применимо к моему запросу, или, по крайней мере, я не знаю, как это сделать. Любая помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ: Я определенно могу иметь две одинаковые строки в таблицах SOURCE & TARGET, и это выдает мне эту ошибку:

Оператор MERGE попытался ОБНОВИТЬ или УДАЛИТЬ ту же строку больше чем один раз. Это происходит, когда целевая строка соответствует более чем одному источнику строка. Оператор MERGE не может ОБНОВИТЬ / УДАЛИТЬ одну и ту же строку цели стол несколько раз. Уточните предложение ON, чтобы обеспечить целевую строку соответствует не более одной исходной строки или используйте предложение GROUP BY для группировки исходные строки.

При добавлении GROUP BY это дает мне указанную выше внешнюю ошибку ссылки.

1 Ответ

0 голосов
/ 04 сентября 2018

Вам не нужен INTERSECT, потому что слияние сравнивает ваши данные уже между исходной и целевой таблицами. Попробуйте что-нибудь, как показано ниже.

MERGE dbo.TargetTbl AS TARGET
USING 
(
    SELECT  CONCAT(OrderNo, '_', OrderLine) AS OrderLineNo,
            MAX(LastDate) AS LastDate
    FROM dbo.SourceTbl
    GROUP BY CONCAT(SOURCE.OrderNo, '_', SOURCE.OrderLine)
) AS SOURCE 
    ON SOURCE.OrderNo = TARGET.OrderNo 
    AND SOURCE.OrderLineNo = CONCAT(TARGET.OrderNo, '_', TARGET.OrderLine)
    AND SOURCE.LastDate = TARGET.LastDate
WHEN MATCHED THEN UPDATE 
        SET TARGET.IsBlocked = 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...