2016-09-16 50 views
1

我有两个表,如下所示,并尝试使用合并指定结果。可能吗?SQL Server:合并两个表中的数据

表1

Table1ID Q1A Q2A  Q3A Active 
    ---------------------------------------- 
    1   2  Test  1  1 
    2   3  Test2 1  1 
    3   4  Test3 1  1 
    4   5  Test4 1  1 
    5   5  Test5 1  0 

我发现了一个其它的条件和与它具有的问题,还存在5行数据,其是不活动在这种情况下,代替更新该行的任何方式的,我需要添加具有相同详细信息但有效行的新行。有关如何更新脚本的任何建议。标识列存在于table1中,因此数据不会被复制。

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

表2

Table1ID E1  E2   E3  
---------------------------------------- 
1   2  TestData1  1  
2   3  TestData2  1  
3   4  TestData3  1  
5   5  TestData5  1  
6   7  TestData6  0 

结果:

Table1ID Q1A Q2A  Q3A Active 
----------------------------------------- 
1   2  Test  1  1 -- Rows with Id 1,2,3 already exists in table 1 dont do anything 
2   3  Test2 1  1 
3   4  Test3 1  1 
4   5  Test4 1  0 -- Rows with Id 4 exists in table 1 but not in table 2 update it to inactive 
5   5  Test5 1  0 
5   5  Test5 1  1 -- Rows with Id 5,6 does not exist in table 1 so insert it 
6   7  Test6 0  1 
+0

你们是不是要更新任何表,或者只是创建一个返回这个结果的查询? – Mureinik

+0

更新表。 – user1098028

回答

2

我能够使用下面的脚本完全匹配结果。希望这可以帮助!如果您有任何问题,请告诉我。

  /* 
       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; 
+0

感谢您的回复,如果我将表2中的tableids作为字符串而不是表格,我该怎么做。我们只是变了,所以想检查是否可能。根据新的变化,我们得到@ strTable2Ids ='1,2,3,5,6' – user1098028

+0

请参阅我的编辑,其中我使用变量代替表格。 – TerryM

1

请试试这个 -

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