3

MERGE に関する msdn トピックを読んでいます。http://msdn.microsoft.com/en-us/library/bb510625.aspx

しかし、それは私にとって非常に混乱しています。テーブルがあるとしましょう。

DECLARE @T Table
(
    ID INt,
    Name VARCHAR(10)
)

そして、私が持っています、

MERGE INTO @T T1
USING (SELECT 4 AS ID) T2 ON (T1.ID = T2.ID)

WHEN MATCHED THEN一致が見つかるWHEN NOT MATCHED THENたびに実行されますか? 一致が見つからないたびに実行されますか? それが正しいか?WHEN NOT MATCHED BY SOURCEとはどうですかWHEN NOT MATCHED BY Target。私を助けてください

4

4 に答える 4

1

targetと の両方からsource別の実行パスにレコードを分岐するという観点から考えます。

以下に、単純な数字のリストの例を示します。full joinマージcaseを表し、「分岐」を表すために a を使用します。

DECLARE @source TABLE ( i INT, c CHAR(1) )
DECLARE @target TABLE ( i INT )

INSERT INTO @source ( i )
VALUES (1), (2), (3), (4), (5)

INSERT INTO @target ( i )
VALUES (1), (2), (3), (6), (7)

SELECT 
    [source] = s.i, 
    [target] = t.i,
    [branch] = CASE WHEN t.i IS NULL THEN 'not matched by target'
                    WHEN s.i IS NULL THEN 'not matched by source'
                    ELSE 'matched' END,
    [possible action] = CASE WHEN t.i IS NULL THEN 'insert into target'
                             WHEN s.i IS NULL THEN 'update target or delete from target'
                             ELSE 'update target or delete from target' END
FROM @source s
FULL JOIN @target t ON t.i = s.i

これにより、次のものが生成されます

source      target      branch                 possible action
----------- ----------- ---------------------  -----------------------------------
1           1           matched                update target or delete from target
2           2           matched                update target or delete from target
3           3           matched                update target or delete from target
4           NULL        not matched by target  insert into target
5           NULL        not matched by target  insert into target
NULL        6           not matched by source  update target or delete from target
NULL        7           not matched by source  update target or delete from target

それで

  • ソース レコードがターゲット ( ) に一致しない場合、not matched by targetこれらはinsertターゲットに追加できます
  • ターゲット レコードがソース ( ) に一致しない場合not matched by source、対応するターゲット レコードをupdated またはdeleted にすることができます。参照するソース レコードがないことは明らかです。
  • ソース レコードがターゲット レコードと一致した場合 ( matched)、ターゲット レコードもupdated またはdeleted になる可能性がありますが、こことは異なりnot matched by source、ソースからのレコードも取得します。

更新と削除については、結合を使用したり、「ブランチ」内でソースをターゲットに、ターゲットをターゲットなどに関連付けたりする必要はありません。これらの関係はすでに解決されており、まるであなたが個人記録。

たとえば、次のように更新する必要があると思うかもしれません

 Update t
 Set t.col = s.col
 From target t
 Join source s On s.id = t.id

しかし、そうではありません。

レコードが or のいずれかである場合matched、データをさらに述語して、 d またはdnot matched by sourceのどちらにするかを決定できます。これは、MERGEの に示されているように、2 つの同じ「ブランチ」に追加の句を提供することによって行われます。deleteupdateANDexample d

于 2013-11-03T16:38:35.310 に答える