обновить много строк в таблице A несколькими строками из таблицы B, используя слияние с хранимой процедурой - PullRequest
0 голосов
/ 24 июня 2019

У меня есть данные в Таблице 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, Detail

1, 11, A

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

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

попробуйте

--data query

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

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

drop table  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  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')


--main query

Declare @IdT1Group integer = 30

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

MERGE table2 AS tblTarget
--traget table 
USING 


--data src
(SELECT table1.IdT1 AS T1Id, tblT2.* FROM tbl2 AS tblT2 CROSS JOIN table1 where IdT1Group = @IdT1Group)
AS tblSource ON tblTarget.IdT1 = tblSource.T1Id And tblTarget.IdT2 = tblSource.IdT2
WHEN NOT MATCHED BY SOURCE THEN 
UPDATE 
SET   Synchronise = 'updated';



MERGE table2 AS tblTarget
--traget table 
USING 


--data src
(SELECT table1.IdT1 AS T1Id, tblT2.* 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'

--insert query
WHEN NOT MATCHED BY TARGET THEN            
INSERT ([idt2],IdT1, Detail, Synchronise)
VALUES (tblSource.idt2,tblSource.T1Id, tblSource.Detail, 'inserted');

select * From Table2
0 голосов
/ 24 июня 2019

Вы удаляете дать данные

3       12        A     updated

4       12        B     updated

И эти данные не существуют в

Declare @IdT1Group integer = 30

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

То есть данные удаляются, если вы все еще хотите обновить их, тогда вам нужно проверить, не существует ли данных, а затем обновить их.

Declare @IdT1Group integer = 30

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


MERGE table2 AS tblTarget
--traget table 
USING 


--data src
(SELECT table1.IdT1 AS T1Id, tblT2.* 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'

--Delete QUery
WHEN NOT MATCHED BY SOURCE THEN
DELETE

--insert query
WHEN NOT MATCHED BY TARGET THEN            
INSERT ([idt2],IdT1, Detail, Synchronise)
VALUES (tblSource.idt2,tblSource.T1Id, tblSource.Detail, 'inserted');

select * From Table2

дайте мне знать, если у вас все еще есть вопрос

...