合并语句中的删除语句问题
Issue with delete statement in merge statement
我正在使用 merge into
语句
我有一个 table 看起来像这样(首先我像这样插入)使用下面的查询:
5
2
5
3
5
5
5
6
table 输入:
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 查询,但它正在删除 table 中的所有记录。我试了,还是不行。
您需要预过滤目标 table,否则 所有 行,即使那些具有不同 sid
将被删除。您可以使用 CTE 或视图进行预过滤。
I note that the WHEN MATCHED
clause makes no sense, as the only column being updated is the join column, which obviously matches anyway.
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
;
我正在使用 merge into
语句
我有一个 table 看起来像这样(首先我像这样插入)使用下面的查询:
5 | 2 |
5 | 3 |
5 | 5 |
5 | 6 |
table 输入:
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 查询,但它正在删除 table 中的所有记录。我试了,还是不行。
您需要预过滤目标 table,否则 所有 行,即使那些具有不同 sid
将被删除。您可以使用 CTE 或视图进行预过滤。
I note that the
WHEN MATCHED
clause makes no sense, as the only column being updated is the join column, which obviously matches anyway.
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
;