sql - 使用 Select 语句更新或插入
问题描述
我正在尝试在 SQL Server 中编写一个执行以下操作的查询:对一个表执行数据聚合查询,然后将结果传递给另一个表。
如果具有该日期的行已经存在,则更新该列,否则插入一个新行
INSERT INTO T2 (timevalue, colValue)
SELECT
Time_Stamp_Hour = DATEADD(hh, DATEPART(hh, E3TimeStamp), CAST(CAST(E3TimeStamp AS date) AS datetime)),
AvgValue = AVG(MyValue)
FROM
(SELECT T1.*
FROM T1
WHERE (Quality) >= 0) t
GROUP BY
DATEADD(hh, DATEPART(hh, E3TimeStamp), CAST(CAST(E3TimeStamp AS date) AS datetime))
ON DUPLICATE KEY UPDATE --TimeStamp matched
colValue = t.AvgValue
但是,我从这个查询中得到一个语法错误:
关键字“ON”的语法不正确
我不知道出了什么问题。有任何想法吗?
非常感谢!
解决方案
sql server 不支持 upsert 语句,你可以使用merge
:
merge T2 as target
using (
select Time_Stamp_Hour=dateadd(hh,datepart(hh,E3TimeStamp), cast(CAST(E3TimeStamp as date) as datetime))
, AvgValue=AVG(MyValue)
from (select T1.*
from T1
where (Quality) >= 0)t
group by dateadd(hh,datepart(hh,E3TimeStamp), cast(CAST(E3TimeStamp as date) as datetime))
) as source
on target.timevalue = source.Time_Stamp_Hour
when not matched
insert (Time_Stamp_Hour,AvgValue)
when matched
update set target.colValue= source.AvgValue
推荐阅读
- ruby-on-rails - 如何识别自定义 COP 中的全局 Rails 设置?
- android - 未应用 AlertDialog 的自定义主题
- python - 对数字元素求和以获得所需的结果
- python - 如何分隔名称和数字总和?
- amazon-web-services - AWS IAM 根据 dynamodb 属性值授予权限
- angular - 刷新 NGRX 没有成功操作
- javascript - `.then` 和 `.catch` Promise 处理程序是否以某种方式配对并像 `.then(resolutionHandler, rejectHandler)` 处理?
- javascript - cv::imdecode 图像从 JS 到 C++ (opencv, emscripten)
- angular - 生成文档时如何修复“ENOENT:没有这样的文件或目录,打开'.../docs/assets/css/main.css'”?
- c++ - 在类体内初始化数据成员