我正在處理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 查詢,但它正在洗掉表中的所有記錄。我嘗試,但無法解決。
uj5u.com熱心網友回復:
您需要預先過濾目標表,否則所有行,即使是具有不同的行也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
;
資料庫<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323661.html
標籤:sql-server 合并
