使用SQL MERGE语句将202008表数据追加到202007表报错如何解决?
错误原因说明
你编写的SQL存在四处核心问题,直接导致语法报错:
- MERGE语法逻辑颠倒:MERGE后接的是目标表(要写入数据的表),USING后接的是源表,你的写法把202008设为目标表,和你要往202007追加数据的需求完全相反
- 语法规则不支持:INSERT VALUES子句中不能直接使用
[表名].*的写法,必须显式列全所有列 - 语法结构错误:MERGE是数据操作语句,不能嵌套在SELECT INTO的FROM子句中作为查询结果集使用
- 缺少必要结束符:SQL Server要求MERGE语句必须以分号结尾,否则会触发语法错误
解决方案
根据你的需求,提供两种适配场景的写法:
场景1:直接往现有202007表追加202008的不重复数据(按ride_id去重)
这是符合你原始需求的正确MERGE写法:
MERGE [PortfolioDB].[dbo].['202007-divvy-tripdata$'] AS target -- 目标表:要写入的202007表 USING [PortfolioDB].[dbo].['202008-divvy-tripdata$'] AS source -- 源表:提供数据的202008表 ON target.ride_id = source.ride_id WHEN NOT MATCHED BY TARGET THEN -- 仅插入源表有、目标表没有的记录 INSERT (ride_id, col2, col3, col4) -- 此处按顺序列全两张表的所有列名 VALUES (source.ride_id, source.col2, source.col3, source.col4) ; -- MERGE语句必须以分号结尾
如果确认两张表的列顺序、字段类型完全一致,也可以简写INSERT部分:
WHEN NOT MATCHED BY TARGET THEN INSERT DEFAULT VALUES
场景2:生成新的全年汇总表,不修改原有月度表(更推荐,适配多表合并需求)
如果你最终要合并多个月度表生成全年表,完全不需要用MERGE,直接用UNION ALL实现,写法更简单、执行性能更高:
-- 自动创建新的汇总表,合并多个月度表数据 SELECT * INTO [PortfolioDB].[dbo].[2020_to_2021_divvy_tripdata] FROM [PortfolioDB].[dbo].['202007-divvy-tripdata$'] UNION ALL -- 确认没有重复ride_id用UNION ALL,需要去重则改成UNION SELECT * FROM [PortfolioDB].[dbo].['202008-divvy-tripdata$'] -- 后续追加其他月份表直接新增UNION ALL + SELECT * FROM 对应月度表即可
如果后续要往已经建好的汇总表追加新的月份数据,用以下写法即可:
INSERT INTO [PortfolioDB].[dbo].[2020_to_2021_divvy_tripdata] SELECT * FROM [PortfolioDB].[dbo].['202009-divvy-tripdata$'] -- 可选去重条件:WHERE ride_id NOT IN (SELECT ride_id FROM [2020_to_2021_divvy_tripdata])
内容的提问来源于stack exchange,提问作者Primeval
相关产品推荐
相关产品推荐

