0

表 1 に次のようなデータがあります:ここに画像の説明を入力してください

IdT1 、 IdT1Group

11、30

12、30

13、30

テーブル 2 のようなもの:ここに画像の説明を入力します

IdT2、IdT1、詳細、同期

1 、 11 、 A 、挿入

2 、 11 、 B 、挿入

3 、 12 、 A 、挿入

4 、 12 、 C 、挿入

私はこのような tblSource を持っています:ここに画像の説明を入力してください

IdT2、IdT1、詳細

1 、 11 、あ

2、11、B

5、11、C

から tblSource を取得しました:

Select Top 1 From Tbl2 where IdT1Group = 30

そして、Tbl2 を次のように更新できることを願っています。ここに画像の説明を入力してください。

IdT2,   IdT1,   Detail, Synchronise

1       11        A     updated

2       11        B     updated

5       11        C     inserted

3       12        A     updated

4       12        B     updated

6       12        C     inserted

7       13        A     inserted

8       13        B     inserted

9       13        C     inserted

これは、私が期待するものを得るために使用するコードです:

    Declare @IdT1Group integer = 30
;WITH tblTbl2
    AS (SELECT table2.* FROM table2 INNER JOIN table1 ON table2.IdT1 = table1.IdT1 AND IdT1Group = @IdT1Group)
    MERGE INTO tblTbl2 AS tblTarget
    USING (SELECT tblT2.*, table1.IdT1 AS T1Id FROM tbl2 AS tblT2 CROSS JOIN table1 where IdT1Group = @IdT1Group)
            AS tblSource ON tblTarget.IdT1 = tblSource.T1Id And tblTarget.IdT2 = tblSource.IdT2
    WHEN MATCHED THEN
        UPDATE 
        SET     Detail = tblSource.Detail, Synchronise = 'updated'
    WHEN NOT MATCHED BY SOURCE THEN
        DELETE
    WHEN NOT MATCHED BY TARGET THEN            
        INSERT (IdT1, Detail, Synchronise)
        VALUES (tblSource.T1Id, tblSource.Detail, 'inserted');

しかし、これは私が得たものです:ここに画像の説明を入力してください

IdT2    IdT1    Detail  Synchronise
1       11        A     updated
2       11        B     updated
5       11        C     inserted
6       12        A     inserted
7       12        B     inserted
8       12        C     inserted
9       13        A     inserted
10      13        B     inserted
11      13        C     inserted

いくつかの試行を行うためのこのコード:

drop table if exists table1
create table table1(idt1 int, idt1group int)

insert into table1 values (11,30),(12,30),(13,30)

drop table if exists table2

create table table2 (idt2 int, idt1 int, detail varchar(2), Synchronise varchar(15))

insert into table2 values (1,11,'A', 'Inserted'),(2,11,'B', 'Inserted'),
(3,12,'A', 'Inserted'),
(4,12,'B', 'Inserted')

drop table if exists tbl2

create table tbl2 (idt2 int, idt1 int, detail varchar(2), Synchronise varchar(15))
insert into tbl2 values (1, 11,'A', 'Inserted'), 
(2,11,'B', 'Inserted'), (5,11,'C', 'Inserted')

Declare @IdT1Group integer = 30

SELECT table1.IdT1 AS T1Id, tblT2.* FROM tbl2 AS tblT2 CROSS JOIN table1 where IdT1Group = @IdT1Group

;WITH tblTbl2
    AS (SELECT table2.* FROM table2 INNER JOIN table1 ON table2.IdT1 = table1.IdT1 AND IdT1Group = @IdT1Group)
    MERGE INTO tblTbl2 AS tblTarget
    USING (SELECT tblT2.*, table1.IdT1 AS T1Id FROM tbl2 AS tblT2 CROSS JOIN table1 where IdT1Group = @IdT1Group)
            AS tblSource ON tblTarget.IdT1 = tblSource.T1Id And tblTarget.IdT2 = tblSource.IdT2
    WHEN MATCHED THEN
        UPDATE 
        SET     Detail = tblSource.Detail, Synchronise = 'updated'
    WHEN NOT MATCHED BY SOURCE THEN
        DELETE
    WHEN NOT MATCHED BY TARGET THEN            
        INSERT (IdT1, Detail, Synchronise)
        VALUES (tblSource.T1Id, tblSource.Detail, 'inserted');

select * From Table2
4

2 に答える 2