Sql server SQL Server:合并两个表中的数据

Sql server SQL Server:合并两个表中的数据,sql-server,tsql,Sql Server,Tsql,我有两个表,如下所示,并尝试使用merge获得指定的结果。可能吗 表1: 我发现了另一个条件,并且存在问题,第5行的数据在这种情况下是非活动的,而不是以任何方式更新该行,我需要添加具有相同详细信息但为活动行的新行。关于如何更新脚本的任何建议。表1存在标识列,因此数据不会重复 在查看现有记录的同时,比较表2中的数据并更新表1中的数据 表2: 结果: 请试试这个- merge @table1 t1 using @table2 t2 on t2.table1_id = t1.id when not m

我有两个表,如下所示,并尝试使用merge获得指定的结果。可能吗

表1:

我发现了另一个条件,并且存在问题,第5行的数据在这种情况下是非活动的,而不是以任何方式更新该行,我需要添加具有相同详细信息但为活动行的新行。关于如何更新脚本的任何建议。表1存在标识列,因此数据不会重复

在查看现有记录的同时,比较表2中的数据并更新表1中的数据

表2:

结果:

请试试这个-

merge @table1 t1
using @table2 t2 on t2.table1_id = t1.id
when not matched by source
then update set t1.active = 0
when not matched by target then
insert (id, q1a, q2a, q3a, active)
values (t2.table1_id, t2.e1, t2.e2, t2.e3, 1);
数据脚本-

declare @table1 table (id int, q1a int, q2a varchar(10), q3a int, active bit)
declare @table2 table (table1_id int, e1 int, e2 varchar(10), e3 int)

insert into @table1
select 1,2,'test',1,1 union
select 2,3,'test2',1,1 union
select 3,4,'test3',1,1 union
select 4,5,'test4',1,1

insert into @table2
select 1,2,'testdata1',1 union
select 2,3,'testdata2',1 union
select 3,4,'testdata3',1 union
select 5,5,'testdata5',1 union
select 6,7,'testdata6',0

select * from @table1
select * from @table2
请试试这个-

merge @table1 t1
using @table2 t2 on t2.table1_id = t1.id
when not matched by source
then update set t1.active = 0
when not matched by target then
insert (id, q1a, q2a, q3a, active)
values (t2.table1_id, t2.e1, t2.e2, t2.e3, 1);
数据脚本-

declare @table1 table (id int, q1a int, q2a varchar(10), q3a int, active bit)
declare @table2 table (table1_id int, e1 int, e2 varchar(10), e3 int)

insert into @table1
select 1,2,'test',1,1 union
select 2,3,'test2',1,1 union
select 3,4,'test3',1,1 union
select 4,5,'test4',1,1

insert into @table2
select 1,2,'testdata1',1 union
select 2,3,'testdata2',1 union
select 3,4,'testdata3',1 union
select 5,5,'testdata5',1 union
select 6,7,'testdata6',0

select * from @table1
select * from @table2

我能够使用下面的脚本精确匹配结果。希望这有帮助!如果你有任何问题,请告诉我

            /* 
                Script to create the tables and merge the data
            */
            -- drop table #Table1; 
            create table #Table1 ( 
                Table1ID INT, 
                Q1A INT, 
                Q2A varchar(10), 
                Q3A INT, 
                Active BIT 
            );  
            INSERT INTO #Table1 VALUES (1, 2, 'Test', 1, 1); 
            INSERT INTO #Table1 VALUES (2, 3, 'Test2', 1, 1); 
            INSERT INTO #Table1 VALUES (3, 4, 'Test3', 1, 1); 
            INSERT INTO #Table1 VALUES (4, 5, 'Test4', 1, 1); 

            -- drop table #Table2; 
            create table #Table2 ( 
                Table1ID INT, 
                E1 INT, 
                E2 varchar(10), 
                E3 INT
            );  
            INSERT INTO #Table2 VALUES (1, 2, 'TestData1', 1); 
            INSERT INTO #Table2 VALUES (2, 3, 'TestData2', 1); 
            INSERT INTO #Table2 VALUES (3, 4, 'TestData3', 1); 
            INSERT INTO #Table2 VALUES (5, 5, 'TestData5', 1); 
            INSERT INTO #Table2 VALUES (6, 7, 'TestData6', 0); 

            ;MERGE INTO #Table1 AS TGT
                USING #Table2 AS SRC 
                    ON TGT.Table1ID = SRC.Table1ID
            WHEN NOT MATCHED BY SOURCE THEN UPDATE 
                SET TGT.Active = CAST(0 AS BIT) 
            WHEN NOT MATCHED THEN INSERT (Table1ID, Q1A, Q2A, Q3A, Active) 
                VALUES (SRC.Table1ID, SRC.E1, REPLACE(SRC.E2, 'Data', ''), SRC.E3, CAST(1 AS BIT)); 

            select * 
            from #Table1;  
您还可以使用变量代替表格,如下所示:

DECLARE @Table1ID INT = 1, 
    @E1 INT = 2, 
    @E2 varchar(10) = 'TestData1', 
    @E3 INT = 1; 

;MERGE INTO #Table1 AS TGT
USING (VALUES(@Table1ID, @E1, @E2, @E3)) 
        AS SRC (Table1ID, E1, E2, E3) 
    ON TGT.Table1ID = SRC.Table1ID
WHEN NOT MATCHED BY SOURCE THEN UPDATE 
SET TGT.Active = CAST(0 AS BIT) 
WHEN NOT MATCHED THEN INSERT (Table1ID, Q1A, Q2A, Q3A, Active) 
VALUES (SRC.Table1ID, SRC.E1, REPLACE(SRC.E2, 'Data', ''), SRC.E3, CAST(1 AS BIT)); 

select * 
from #Table1; 

我能够使用下面的脚本精确匹配结果。希望这有帮助!如果你有任何问题,请告诉我

            /* 
                Script to create the tables and merge the data
            */
            -- drop table #Table1; 
            create table #Table1 ( 
                Table1ID INT, 
                Q1A INT, 
                Q2A varchar(10), 
                Q3A INT, 
                Active BIT 
            );  
            INSERT INTO #Table1 VALUES (1, 2, 'Test', 1, 1); 
            INSERT INTO #Table1 VALUES (2, 3, 'Test2', 1, 1); 
            INSERT INTO #Table1 VALUES (3, 4, 'Test3', 1, 1); 
            INSERT INTO #Table1 VALUES (4, 5, 'Test4', 1, 1); 

            -- drop table #Table2; 
            create table #Table2 ( 
                Table1ID INT, 
                E1 INT, 
                E2 varchar(10), 
                E3 INT
            );  
            INSERT INTO #Table2 VALUES (1, 2, 'TestData1', 1); 
            INSERT INTO #Table2 VALUES (2, 3, 'TestData2', 1); 
            INSERT INTO #Table2 VALUES (3, 4, 'TestData3', 1); 
            INSERT INTO #Table2 VALUES (5, 5, 'TestData5', 1); 
            INSERT INTO #Table2 VALUES (6, 7, 'TestData6', 0); 

            ;MERGE INTO #Table1 AS TGT
                USING #Table2 AS SRC 
                    ON TGT.Table1ID = SRC.Table1ID
            WHEN NOT MATCHED BY SOURCE THEN UPDATE 
                SET TGT.Active = CAST(0 AS BIT) 
            WHEN NOT MATCHED THEN INSERT (Table1ID, Q1A, Q2A, Q3A, Active) 
                VALUES (SRC.Table1ID, SRC.E1, REPLACE(SRC.E2, 'Data', ''), SRC.E3, CAST(1 AS BIT)); 

            select * 
            from #Table1;  
您还可以使用变量代替表格,如下所示:

DECLARE @Table1ID INT = 1, 
    @E1 INT = 2, 
    @E2 varchar(10) = 'TestData1', 
    @E3 INT = 1; 

;MERGE INTO #Table1 AS TGT
USING (VALUES(@Table1ID, @E1, @E2, @E3)) 
        AS SRC (Table1ID, E1, E2, E3) 
    ON TGT.Table1ID = SRC.Table1ID
WHEN NOT MATCHED BY SOURCE THEN UPDATE 
SET TGT.Active = CAST(0 AS BIT) 
WHEN NOT MATCHED THEN INSERT (Table1ID, Q1A, Q2A, Q3A, Active) 
VALUES (SRC.Table1ID, SRC.E1, REPLACE(SRC.E2, 'Data', ''), SRC.E3, CAST(1 AS BIT)); 

select * 
from #Table1; 

您是否正在尝试更新任何表,或者只是创建一个返回此结果的查询?正在更新表。您是否正在尝试更新任何表,或者只是创建一个返回此结果的查询?正在更新表。如果表2中的TableID是字符串而不是表,谢谢您的回答。我如何才能做到这一点。我们刚换了衣服,想看看是否可能。根据新的更改,我们得到了@strTable2Ids='1,2,3,5,6',请查看我的编辑,其中我使用变量代替了表。如果我在表2中得到的TableID是字符串而不是表,感谢您的回复。我如何才能做到这一点。我们刚换了衣服,想看看是否可能。根据新的更改,我们得到@strTable2Ids='1,2,3,5,6',请查看我的编辑,其中我使用变量代替表。