sql - 使用最新数据更新表而不删除和复制
问题描述
我有一个存储过程,每 2 小时在填充表的作业代理上执行一次。存储过程删除表中的所有内容,然后重新插入所有内容。这对使用此表的任何报告都是有害的,因为在作业代理执行期间,短时间内没有数据。
我需要做的只是让 sp 将最新的行插入到表中,而不进行任何删除并且不复制所有内容。
我要插入的表格类似于下面。
unique CALL_TIME ACTUAL_STOP CAR
1 10:40 A B2
1 10:42 C C3
2 15:40 NULL B2
3 15:45 A E5
3 15:45 A E6
3 15:45 A E1
这是我试过的
CREATE TABLE #tempSP
(
[Unique] [varchar](20),
[CALL_TIME] [datetime] ,
[ACTUAL_STOP] [varchar](10),
[CAR] [varchar] (5)
)
INSERT INTO #tempSP
SELECT
[Unique],
[CALL_TIME],
[ACTUAL_STOP],
[CAR]
FROM Table
select * from #tempSP as s
where Not exists
(
select * from [dbo].[test_table] as tt
where s.unique = tt.unique
输出类似于下面的内容,您可以看到添加了一行,这很棒,这就是我想要的。但 'Unique 2' 的 ACTUAL_STOP 仍然为 NULL。该字段通常是我们系统中最后填充的内容,因此它暂时为 NULL 并不罕见,但是一旦填充它就永远不会使用此方法更新。
unique CALL_TIME ACTUAL_STOP CAR
1 10:40 A B2
1 10:42 C C3
2 15:40 NULL B2
3 15:45 A E5
3 15:45 A E6
3 15:45 A E1
4 09:10 B B2
MERGE我也试过了,这个方法和上面一样,还是有没有更新ACTUAL_STOP字段的问题。
CREATE TABLE #tempSP
(
[Unique] [varchar](20),
[CALL_TIME] [datetime] ,
[ACTUAL_STOP] [varchar](10),
[CAR] [varchar] (5)
)
INSERT INTO #tempSP
SELECT
[Unique],
[CALL_TIME],
[ACTUAL_STOP],
[CAR]
FROM Table
select * from #tempSP as s
MERGE [dbo].[test_table] as d
USING #tempSP as s
ON (d.unique = s.unique)
WHEN MATCHED AND d.unique = s.unique
WHEN NOT MATCHED THEN INSERT ([unique], [CALL_TIME], [ACTUAL_STOP], [CAR])
VALUES(s.[unique],s.[CALL_TIME], s.[ACTUAL_STOP], s.[CAR])
还添加了更新集
CREATE TABLE #tempSP
(
[Unique] [varchar](20),
[CALL_TIME] [datetime] ,
[ACTUAL_STOP] [varchar](10) ,
[CAR] [varchar] (5)
)
INSERT INTO #tempSP
SELECT
[Unique],
[CALL_TIME],
[ACTUAL_STOP],
[CAR]
FROM Table
select * from #tempSP as s
MERGE [dbo].[test_table] as d
USING #tempSP as s
ON (d.unique = s.unique)
WHEN MATCHED AND d.unique = s.unique
THEN UPDATE SET d.unique = s.unique, d.[CALL_TIME] = s.{CALL_TIME], d.[ACTUAL_STOP] = s.[ACTUAL_STOP], d.[CAR] = s.[CAR]
WHEN NOT MATCHED THEN INSERT ([unique], [CALL_TIME], [ACTUAL_STOP], [CAR])
VALUES(s.[unique],s.[CALL_TIME], s.[ACTUAL_STOP], s.[CAR])
这给出了错误'A MERGE 语句不能多次更新/删除目标表的同一行。优化 ON 子句以确保目标行最多匹配一个源行,或使用 GROUP BY 子句对源行进行分组。
解决方案
推荐阅读
- javascript - 无法使用 Node.js 从 MySQL 表中正确检索数据
- php - php mysqli_query 如何与 mysqli_fetch_array 和命名索引一起工作?
- r - 循环遍历文件 R 中的文件名列表
- jquery - jquery中滑块的值
- python - numpy 通过矢量化或 einsum 组合元素(hadamard)和 3D 数组的外积的示例
- loopbackjs - 有没有办法区分自定义远程方法和标准远程方法?
- c# - 无法在 C# 中捕获“System.IO.DirectoryNotFoundException”
- http - Tomcat上的websocket端口
- angular - NgRx Data 自定义 URL 生成器
- python - 如何比较python数据框中两列中的标记词