T-SQL 合并:每个分组依据表达式必须至少包含一个不是外部引用的列



使用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 语句试图更新或删除同一行 不止一次。当目标行与多个源匹配时,会发生这种情况 排。合并语句不能更新/删除目标的同一行 表多次。优化 ON 子句以确保目标行 最多匹配一个源行,或使用 GROUP BY 子句对 源行。

通过添加 GROUP BY,它给了我上面提到的外部引用错误。

您不需要 INTERSECT,因为 Merge 会在源表和目标表之间比较您的数据。尝试如下操作。

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;

最新更新