2016-09-16 52 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