Sql 从一个表更新并插入另一个表

Sql 从一个表更新并插入另一个表,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有两张桌子: 表1:ID、代码、名称 表2:ID、代码、名称 同列 我想将数据从table1插入table2,或者更新列(如果table2 table1.ID=table2.ID中存在) 做这件事的简单方法是什么 如果不使用OUT MERGE假设ID列是唯一的且不应设置,那么似乎可以在两条SQL语句中完成 /* UPDATE the rows in TABLE2 */ UPDATE TABLE2 SET NAME = (SELECT NAME FROM TABLE1 WHERE TAB

我有两张桌子:

表1:ID、代码、名称 表2:ID、代码、名称 同列

我想将数据从table1插入table2,或者更新列(如果table2 table1.ID=table2.ID中存在)

做这件事的简单方法是什么


如果不使用OUT MERGE

假设ID列是唯一的且不应设置,那么似乎可以在两条SQL语句中完成

/* UPDATE the rows in TABLE2 */
UPDATE TABLE2
    SET NAME = (SELECT NAME FROM TABLE1 WHERE TABLE1.CODE = TABLE2.CODE)
WHERE CODE IN (SELECT CODE FROM TABLE1)

/* INSERT the rows that are missing */
INSERT INTO TABLE2
    (CODE, NAME)
    (
         SELECT CODE, NAME
         FROM TABLE1
         WHERE CODE NOT IN (SELECT CODE FROM TABLE2)
    )

假设ID列是唯一的并且不应该设置,那么似乎可以在两条SQL语句中完成

/* UPDATE the rows in TABLE2 */
UPDATE TABLE2
    SET NAME = (SELECT NAME FROM TABLE1 WHERE TABLE1.CODE = TABLE2.CODE)
WHERE CODE IN (SELECT CODE FROM TABLE1)

/* INSERT the rows that are missing */
INSERT INTO TABLE2
    (CODE, NAME)
    (
         SELECT CODE, NAME
         FROM TABLE1
         WHERE CODE NOT IN (SELECT CODE FROM TABLE2)
    )
Merge语句存在一些问题,因此应与..一起使用

此外,我建议使用merge作为两个独立的DML语句,如下所示

insert into table2
select * from table1 t1 where not exists (select 1 from table2 t2 where t2.id=t1.id)

update t2
set 
t2.id=t1.id,
t2.name=t1.name
from 
table1 t1
join
table2 t2
on t1.id=t2.id
他在详细的报告中陈述了理由

Merge语句存在一些问题,因此应与..一起使用

此外,我建议使用merge作为两个独立的DML语句,如下所示

insert into table2
select * from table1 t1 where not exists (select 1 from table2 t2 where t2.id=t1.id)

update t2
set 
t2.id=t1.id,
t2.name=t1.name
from 
table1 t1
join
table2 t2
on t1.id=t2.id

此处详细说明的原因。

获取表1中但不在表2中的所有行

insert into table2(id, code, name)(
SELECT table1.*
FROM table1
    LEFT JOIN table2 ON (table1.id = table2.id)
WHERE table2.C IS NULL
)
更新表2

update table2 set name = (select name from table1 where table1.code = table2.code and table1.id = table2.id)

如果您希望手动完成此操作,那么在更新和插入时可能值得一看

获取表1中但不在表2中的所有行

insert into table2(id, code, name)(
SELECT table1.*
FROM table1
    LEFT JOIN table2 ON (table1.id = table2.id)
WHERE table2.C IS NULL
)
更新表2

update table2 set name = (select name from table1 where table1.code = table2.code and table1.id = table2.id)

如果您想手动完成更新和插入,可能值得一看。这里,我正在编写一个脚本,当您想从表1更新表2时,可以使用full

    Update table2 set table2.code = table1.code, table2.name=table1.name from table1 where table2.id=table1.id
如果要插入,请使用此脚本

Insert into table2  (id,code,name) select id,code,name from table1
如果在表2中,id不是自动递增的。
否则不要在表2中插入id列的值。

这里我编写了一个脚本,当您想从表1更新表2时,它将使用full

    Update table2 set table2.code = table1.code, table2.name=table1.name from table1 where table2.id=table1.id
如果要插入,请使用此脚本

Insert into table2  (id,code,name) select id,code,name from table1
如果在表2中,id不是自动递增的。 否则,不要在表2中插入id列的值。

在源表中更新日期后将日期插入目标表 这里有一个工作示例:

create table Table1(id int,name varchar(100));
create table Table2(id int,name varchar(100));
create trigger Table1Trigger after insert on Table1 for each row begin
    insert into Table2(id, name) values (new.id, new.name);
end;
使用以下查询验证结果

insert into Table1 values(1,'John'),(2,'Smith'),(3,'Carol');
在源表中更新日期后将日期插入目标表 这里有一个工作示例:

create table Table1(id int,name varchar(100));
create table Table2(id int,name varchar(100));
create trigger Table1Trigger after insert on Table1 for each row begin
    insert into Table2(id, name) values (new.id, new.name);
end;
使用以下查询验证结果

insert into Table1 values(1,'John'),(2,'Smith'),(3,'Carol');

可能的重复:将表1合并到表2中,在匹配的位置更新,在不匹配的位置插入-我不能使用合并,因为我的数据库是SQL SERVER 2005,那么您可能需要分两步执行:1将表2中缺少的行插入表1,2更新不匹配的行。作为旁注,您需要两个相同的表有什么特别的原因吗?是的,我在表1中插入和更新了很多次,然后我需要立即对表2执行这些操作可能的重复:您将表1合并到表2中,更新匹配的位置并插入不匹配的位置-我不能使用合并,因为我的数据库是SQL SERVER 2005。那么您可能需要分两步执行:1将表2中缺少的行插入表1,2更新不匹配的行。作为旁注,您需要两个相同的表有什么特别的原因吗?是的,我在表1中插入和更新了很多次,然后我需要立即执行这些操作以表2谢谢您的建议。有什么明显的原因吗。。还是指针?这是显而易见的原因。如果先插入,则也会更新新插入的记录;我同意。首先使用更新。另外,我将把insert/update 2语句包装成一个TRANS。谢谢你的建议。有什么明显的原因吗。。还是指针?这是显而易见的原因。如果先插入,则也会更新新插入的记录;我同意。首先使用更新。此外,我还将insert/update 2语句包装成TRANS。