You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:44:08