2

以下のようなデータを含むテーブルがあります(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
4

1 に答える 1

1

アップデート :

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] )
        ;


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])
            or not( [TV].[id] in (select distinct id from cte)
            and [TV].[valueId] in (select distinct valueid from cte))
        WHEN NOT MATCHED 
            THEN INSERT VALUES   ( id , [valueId] , [Value] )
        WHEN NOT MATCHED BY Source 
            THEN DELETE ;

SELECT  *
FROM    @tmp_value
于 2013-05-06T11:08:12.593 に答える