MERGE文によるテーブルの同期




       :

 

USE TEMPDB
GO
IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1
IF OBJECT_ID('T2') IS NOT NULL DROP TABLE T2
GO
CREATE TABLE T1(ID1 INT,VAL1 VARCHAR(50))
CREATE TABLE T2(ID2 INT,VAL2 VARCHAR(50))
GO
INSERT INTO T1
SELECT 1,'A' UNION ALL
SELECT 2,'B' UNION ALL
SELECT 3,'C'

 

         T2  T1   ,       MERGE     ,         :

MERGE INTO T2 AS TB_TARGET
USING T1 AS TB_SOURCE
ON TB_TARGET.ID2=TB_SOURCE.ID1
WHEN NOT MATCHED BY TARGET THEN 
INSERT(ID2,VAL2)
VALUES(ID1,VAL1)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN 
UPDATE SET
TB_TARGET.VAL2=TB_SOURCE.VAL1
OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2
;

  MERGE       

/*

$ACTION    ID2         VAL2                                               VAL2
---------- ----------- -------------------------------------------------- --------------------------------------------------
INSERT     1           NULL                                               A
INSERT     2           NULL                                               B
INSERT     3           NULL                                               C

*/

      T2   :

 

SELECT * FROM T2

/*

ID2         VAL2
----------- --------------------------------------------------
1           A
2           B
3           C

*/

 

    T1        ,            。

          ,      、  、      :

UPDATE T1 SET VAL1='D' WHERE ID1=3


DELETE FROM T1 WHERE ID1=2


INSERT INTO T1
SELECT 4,'E'



SELECT * FROM T1 
/*
ID1         VAL1
----------- --------------------------------------------------
1           A
4           E
3           D
*/

         ,1  ,2  ,3  ,4   。       MERGE  :

MERGE INTO T2 AS TB_TARGET
USING T1 AS TB_SOURCE
ON TB_TARGET.ID2=TB_SOURCE.ID1
WHEN NOT MATCHED BY TARGET THEN 
INSERT(ID2,VAL2)
VALUES(ID1,VAL1)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN 
UPDATE SET
TB_TARGET.VAL2=TB_SOURCE.VAL1
OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2
;

/*

$ACTION    ID          VAL2                                               VAL2
---------- ----------- -------------------------------------------------- --------------------------------------------------
INSERT     4           NULL                                               E
DELETE     2           B                                                  NULL
UPDATE     3           C                                                  D

*/

 

   T2   

SELECT * FROM T2

/*

ID2         VAL2
----------- --------------------------------------------------
1           A
3           D
4           E

*/

    ,         。     ,           ,     MERGE  ,        

MERGE INTO T2 AS TB_TARGET
USING T1 AS TB_SOURCE
ON TB_TARGET.ID2=TB_SOURCE.ID1
WHEN NOT MATCHED BY TARGET THEN 
INSERT(ID2,VAL2)
VALUES(ID1,VAL1)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN 
UPDATE SET
TB_TARGET.VAL2=TB_SOURCE.VAL1
OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2
;

 

1.

MERGE INTO T2 AS TB_TARGET

         。MERGE    ,INTO    ,T2     ,AS    ,TB_TARGET    。

                ,  WITH(...),  T2 AS      。

2.

USING T1 AS TB_SOURCE

                。USING    ,T1          ,    JOIN           。

AS  ,TB_SOURCE   。

3.

ON TB_TARGET.ID2=TB_SOURCE.ID1

    ,      ,                 。

4.

WHEN NOT MATCHED BY TARGET THEN

INSERT(ID2,VAL2)
VALUES(ID1,VAL1)

       。  INSERT             “            ,   ”。

NOT MATCHED     , BY TARGET              (     ON   )   , BY TARGET     ,    BY TARGET,       WHEN MATCHED     ,      MERGE。

               ,               VALUES   SELECT,             。

5.

WHEN NOT MATCHED BY SOURCE THEN
DELETE

      ,               ,       。              ,   NOT MATCHED   BY TARGET。

6.

WHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN 
UPDATE SET
TB_TARGET.VAL2=TB_SOURCE.VAL1

      AND      ,             ,      ,ID 1        ,               ,                。

7.

OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2

       ,           ,         INSERTED DELETED         ,                ,      MERGE               ,      。         ,      ,           。

8.

;

     。。。。。

 

  ,4,5,6,7       , 4,5,6      ,   MERGE        。          OPTION    

 
 

        MERGE           IO  

MERGE INTO T2 AS TB_TARGET
USING T1 AS TB_SOURCE
ON TB_TARGET.ID2=TB_SOURCE.ID1
WHEN NOT MATCHED BY TARGET THEN 
INSERT(ID2,VAL2)
VALUES(ID1,VAL1)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN MATCHED AND TB_TARGET.VAL2<>TB_SOURCE.VAL1 THEN 
UPDATE SET
TB_TARGET.VAL2=TB_SOURCE.VAL1
OUTPUT $ACTION,ISNULL(DELETED.ID2,INSERTED.ID2) AS ID,DELETED.VAL2,INSERTED.VAL2
; 
/*
  'T2'。     2,     7  ,     0  ,   0  ,lob      0  ,lob      0  ,lob    0  。
  'T1'。     2,     4  ,     0  ,   0  ,lob      0  ,lob      0  ,lob    0  。
*/ 
PRINT '------------------------------------------------------------------------------------'
INSERT INTO T2(ID2,VAL2)
SELECT ID1,VAL1
FROM T1 WHERE NOT EXISTS(
SELECT 1 FROM T2 WHERE T2.ID2=T1.ID1
)

UPDATE T2
SET T2.VAL2=T1.VAL1
FROM T2
INNER JOIN T1 ON T2.ID2=T1.ID1
AND T2.VAL2<>T1.VAL1

DELETE FROM T2 WHERE NOT EXISTS(
SELECT 1 FROM T1 WHERE T1.ID1=T2.ID2
) 
/*
  'T2'。     1,     4  ,     0  ,   0  ,lob      0  ,lob      0  ,lob    0  。
  'Worktable'。     1,     5  ,     0  ,   0  ,lob      0  ,lob      0  ,lob    0  。
  'T1'。     1,     1  ,     0  ,   0  ,lob      0  ,lob      0  ,lob    0  。
  'T2'。     1,     2  ,     0  ,   0  ,lob      0  ,lob      0  ,lob    0  。
  'T1'。     1,     4  ,     0  ,   0  ,lob      0  ,lob      0  ,lob    0  。
  'T2'。     1,     1  ,     0  ,   0  ,lob      0  ,lob      0  ,lob    0  。
  'T1'。     1,     4  ,     0  ,   0  ,lob      0  ,lob      0  ,lob    0  。
*/