如何通过使用另一个表来更新表,以便它放入新数据,如果它与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 |
答案 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