以下のようなデータを含むテーブルがあります(Table 1
)
id valueId Value
----------- ----------- --------------------------------------------------
1 1 Value 1
1 1 Value 2
1 1 Value 3
1 2 Value 1
1 2 Value 2
1 2 Value 3
そして、私は以下のような別のデータセットを持っています( DataSet
)
id valueId Value
----------- ----------- -------
1 1 Value 1
1 1 Value 2
1 1 Value 4
今、私は存在しないレコードを挿入する必要がありますTable 1
(レコードを見ることができます
id valueId Value
----------- ----------- -------
1 1 Value 4
にない場合Table 1
、そのレコードを挿入する必要があります) からレコードを削除する必要がTable 1
ありDataSet
ます。
id valueId Value
----------- ----------- -------
1 1 Value 3
、ただし、他のレコードには影響しません (他のレコードは のレコードを意味しますid=1 and valueId=2
)。
を使用して記述した次の T-SQL を使用しMERGE
ました。不足しているレコードを挿入しますが、含まれていないすべてのレコードを削除しますDataSet
DECLARE @tmp_value AS TABLE
(
id INT ,
valueId INT ,
[Value] NVARCHAR(50)
) ;
INSERT @tmp_value
( [id], [valueId], [Value] )
VALUES ( 1, 1, N'Value 1' ),
( 1, 1, N'Value 2' ),
( 1, 1, N'Value 3' ),
( 1, 2, N'Value 1' ),
( 1, 2, N'Value 2' ),
( 1, 2, N'Value 3' ) ;
--SELECT *
--FROM @tmp_value AS TV ;
WITH cte
AS ( SELECT 1 AS id , 1 AS valueId , 'Value 1' AS [Value]
UNION
SELECT 1 AS id , 1 AS valueId , 'Value 2' AS [Value]
UNION
SELECT 1 AS id , 1 AS valueId , 'Value 4' AS [Value]
)
MERGE @tmp_value AS TV
USING cte
ON [cte].[id] = [TV].[id]
AND [cte].[valueId] = [TV].[valueId]
AND [cte].[Value] = [TV].[Value]
WHEN NOT MATCHED
THEN INSERT VALUES ( id , [valueId] , [Value] )
WHEN NOT MATCHED BY SOURCE
THEN DELETE ;
SELECT *
FROM @tmp_value
期待される結果:
id valueId Value
----------- ----------- --------------------------------------------------
1 1 Value 1
1 1 Value 2
1 1 Value 4
1 2 Value 1
1 2 Value 2
1 2 Value 3