比较两个表和插入/更新数据

时间:2015-12-15 08:55:43

标签: sql-server-2008 tsql

我有两个表,如下所示我需要做的是 循环遍历Table2行,需要检查table2中是否存在Table2中的table1ID。如果存在,则将现有table1行活动标志更新为0,并在table1中插入具有Table2行值的新记录。如果不存在,则在table1中插入一个包含Table2行值的新记录。我们可以假设E1,E2,E3列对应于表1中的Q1A,Q2A,Q3A。

Table1:
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


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

2 个答案:

答案 0 :(得分:1)

因此,在这两种情况下,如果记录存在,您将从Table2插入一行。唯一的区别是,如果表1中存在,则要将其设置为零。

DECLARE @currid INT, @maxid INT, @lastid INT

SELECT @currid = 0
, @lastid = 0
, @maxid = MAX(Table1ID) 
FROM Table2

WHILE (@currid < @maxid)
BEGIN
  -- Get the next minimum Table1ID from Table2
  SELECT @currid = MIN(Table1ID)
  FROM Table2
  WHERE Table1ID > @lastid

  -- See if it exists in Table1
  IF EXISTS (SELECT 1 FROM Table1 WHERE Table1ID = @currid)
  BEGIN
    -- Set Active to zero as specified
    UPDATE Table1ID
    SET Active = 0
    WHERE Table1ID = @currid
  END

  -- Copy row from Table2 - I assume with all columns as well as 1 for Active
  INSERT INTO Table1
  SELECT *, 1
  FROM Table2
  WHERE Table1ID = @currid

  -- Set our ID value for the next loop
  SET @lastid = @currid
END

答案 1 :(得分:1)

  

如果存在       将现有table1行活动标志更新为0       和       在table1中插入一条新记录,其中包含Table2行的值。

     

如果不存在,请在table1中使用Table2行

中的值插入新记录

根据您所写的内容,您似乎希望将现有记录的Active列更新为0,并在任何情况下插入Table2 中的记录。

下面应该适合你:

MERGE Table1 t1
USING Table2 t2
ON t1.Table1ID = t2.Table1ID
WHEN MATCHED THEN
  UPDATE
  SET t1.Active = 0;

INSERT (Table1ID, Q1A, Q2A, Q3A, Active)
VALUES (t2.Table1ID, E1, E2, E3, 1);
相关问题