SQL Server中使用SELECT语句实现Upsert(更新或插入)时ON关键字语法错误问题排查
问题原因与解决方案
你遇到的语法错误根源很明确:ON DUPLICATE KEY UPDATE是MySQL专属的语法,SQL Server并不支持这个语句。在SQL Server中,要实现「存在则更新,不存在则插入」(也就是常说的Upsert)的逻辑,标准且推荐的做法是使用MERGE语句。
下面是针对你的需求改写后的正确查询:
MERGE INTO T2 AS Target USING ( SELECT Time_Stamp_Hour = DATEADD(hh, DATEPART(hh, E3TimeStamp), CAST(CAST(E3TimeStamp AS date) AS datetime)), AvgValue = AVG(MyValue) FROM T1 WHERE Quality >= 0 GROUP BY DATEADD(hh, DATEPART(hh, E3TimeStamp), CAST(CAST(E3TimeStamp AS date) AS datetime)) ) AS Source ON Target.timevalue = Source.Time_Stamp_Hour WHEN MATCHED THEN UPDATE SET Target.colValue = Source.AvgValue WHEN NOT MATCHED THEN INSERT (timevalue, colValue) VALUES (Source.Time_Stamp_Hour, Source.AvgValue);
关键细节说明:
MERGE语句会将Source(你的聚合查询结果)和Target(T2表)按ON子句的条件(这里是日期时间完全匹配)进行关联- 当匹配到T2中已有对应日期的行时(
WHEN MATCHED),执行更新操作,将T2的colValue替换为聚合计算出的平均值 - 当没有匹配到对应行时(
WHEN NOT MATCHED),执行插入操作,把聚合得到的日期和平均值写入T2 - 务必确保T2表的
timevalue列设置了主键或唯一约束,否则MERGE无法正确识别重复行,可能会导致意外的重复插入
另外,我简化了你原来的子查询逻辑(SELECT T1.* FROM T1 WHERE Quality >=0可以直接写成FROM T1 WHERE Quality >=0),功能完全一致但代码更简洁。
内容的提问来源于stack exchange,提问作者FelipeFonsecabh
相关产品推荐
相关产品推荐

