从另一个表更新表并添加新值

时间:2014-04-25 22:01:32

标签: sql sql-server

如何通过使用另一个表来更新表,以便它放入新数据,如果它与id不匹配,则会添加新的id和数据。我原来的表比新表大得多,它会更新它。并且新表中有一些ID不在旧表中,但需要添加。

例如我有: 表正在更新 -

  +-------------------+
  |  Original Table   |
  +-------------------+
  |  ID  |  Initials  |
  |------+------------|
  |  1   |  ABC       |
  |  2   |  DEF       |
  |  3   |  GHI       |

和... 表格我从中提取数据以更新另一个表格 -

  +-------------------+
  |    New Table      |
  +-------------------+
  |  ID  |  Initials  |
  |------+------------|
  |  1   |  XZY       |
  |  2   |  QRS       |
  |  3   |  GHI       |
  |  4   |  ABC       |

然后我希望我的原始表能够获得与新表相匹配的值(如果它们已更改),并添加任何新的ID行(如果它们不在原始表中),因此在此示例中看起来像新桌子。

  +-------------------+
  |   Original Table  |
  +-------------------+
  |  ID  |  Initials  |
  |------+------------|
  |  1   |  XZY       |
  |  2   |  QRS       |
  |  3   |  GHI       |
  |  4   |  ABC       |

3 个答案:

答案 0 :(得分:2)

您可以使用MERGE语句将此UPSERT操作放在一个语句中,但是合并语句存在问题我会将其拆分为两个语句,UPDATE和INSERT

<强>更新

UPDATE O
SET O.Initials  = N.Initials  
FROM Original_Table O INNER JOIN New_Table N 
ON O.ID = N.ID

插入

INSERT INTO Original_Table (ID , Initials)
SELECT ID , Initials  
FROM New_Table
WHERE NOT EXISTS ( SELECT 1 
                   FROM Original_Table
                   WHERE ID = Original_Table.ID)

重要提示

我建议避免使用合并声明的原因请阅读本文{em> Aaron Bertrand

答案 1 :(得分:0)

您需要使用MERGE语句:

MERGE  original_table AS Target
USING updated_table as Source
ON original_table.id = updated_table.id
WHEN MATCHED THEN UPDATE SET Target.Initials = Source.Initials
WHEN NOT MATCHED THEN INSERT(id, Initials) VALUES(Source.id, Source.Initials);

您尚未指定,如果在更新的表中找不到原始表中的值,会发生什么。但是,为了以防万一,您可以添加它以从原始表中删除它们:

WHEN NOT MATCHED BY SOURCE
   THEN DELETE

答案 2 :(得分:0)

如果您可以在PHP中使用循环并遍历所有表并逐个复制到另一个表。

另一个选项

DECLARE @COUT INT 
SET @COUT = SELECT COUNT(*) FROM New_Table
    WHILE (true)
    BEGIN
    IF @COUT = 0
      BREAK;
SET @COUT = @COUT - 1
    DECLARE @id INT
    DECLARE @ini VARCHAR(20)
    SET @id = (SELECT id FROM New_Table);
    SET @ini = (SELECT Initials FROM New_Table);
    IF (SELECT COUNT(*) FROM Original_Table WHERE id=@id ) > 0 
    UPDATE SET ID = @id,Initials = @ini FROM Original_Table WHERE id = @id;
    insert into Original_Table values(@id,@ini);
    END
    GO