sql-server - 合并语句中的删除语句问题
问题描述
我正在处理merge into
声明
我有一个看起来像这样的表(首先我像这样插入)使用下面的查询:
5 | 2 |
5 | 3 |
5 | 5 |
5 | 6 |
表类型:
CREATE TYPE [dbo].[userid] AS TABLE(
[userid] [bigint] NULL
)
GO
现在我想要以下输出:
5 | 2 |
5 | 3 |
5 | 6 |
我这样写下面的查询:
--use test
declare @sid varchar(100) = '5'
declare @uid as userid
insert into @uid(userid) values(2)
insert into @uid(userid) values(3)
--insert into @uid(userid) values(5) // I remove this line
insert into @uid(userid) values(6)
MERGE INTO dbo.test_master AS dest
USING @uid AS sou ON
dest.sid = @sid
AND
sou.userid = dest.testid
WHEN MATCHED THEN UPDATE SET
dest.testid = sou.userid
WHEN NOT MATCHED THEN
INSERT( sid, testid )
VALUES( @sid, sou.userid )
--WHEN NOT MATCHED BY SOURCE
-- THEN
-- DELETE
;
我正在努力实现这个输出
5 | 2 |
5 | 3 |
5 | 6 |
我正在使用delete
关键字,请参阅我的 SQL 查询,但它正在从表中删除所有记录。我尝试,但无法解决。
解决方案
您需要预先过滤目标表,否则将删除所有行,即使是不同的行。sid
您可以使用 CTE 或视图进行预过滤。
我注意到该
WHEN MATCHED
子句没有意义,因为唯一要更新的列是连接列,它显然仍然匹配。
declare @sid varchar(100) = '5';
declare @uid as userid;
insert into @uid (userid) values
(2),
(3),
-- (5), -- I remove this line
(6);
WITH dest AS (
SELECT *
FROM dbo.test_master dest
WHERE dest.sid = @sid
)
MERGE INTO dest
USING @uid AS sou ON
sou.userid = dest.testid
-- WHEN MATCHED THEN UPDATE SET
-- dest.testid = sou.userid -- doesn't make sense
WHEN NOT MATCHED THEN
INSERT( sid, testid )
VALUES( @sid, sou.userid )
WHEN NOT MATCHED BY SOURCE THEN
DELETE
;
推荐阅读
- javascript - AXIOS POST 从响应中提取数据
- powershell - 从 powershell 编译名称为 1.0 的 gcc 库
- flutter - 颤振中的占位符骨架
- rxjs - RxJS:当网络工作者受 CPU 限制时,忽略除最后一条消息之外的所有消息
- angular - MSAL-Angular 是否有任何事件或回调可用于注册完成?
- android - 如何停止Android服务中的线程
- angular - 位置对象的承载属性的目的是什么?
- python - 每 X 分钟执行一次逻辑(没有 cron)?
- django - django-rest-framework 聚合总和字段
- python - 3D Numpy 数组到数组转换的列表