UPDATE B SET B.value_col1=A.value_col1 ,B.value_col2=A.value_col2 ... FROM A, B WHERE B.key_col1=A.key_col1 AND B.key_col2=A.key_col2--插入不存在的 INSERT INTO B (col1, col2, col3, ... ) SELECT col1, col2, col3, ... FROM A WHERE NOT EXISTS (SELECT 1 FROM B WHERE B.key_col1=A.key_col1 AND B.key_col2=A.key_col2)
--更新已经存在的 UPDATE B SET B.value_col1=A.value_col1 ,B.value_col2=A.value_col2 ... FROM A, B WHERE B.key_col1=A.key_col1 AND B.key_col2=A.key_col2--插入不存在的 INSERT INTO B (col1, col2, col3, ... ) SELECT col1, col2, col3, ... FROM A WHERE NOT EXISTS (SELECT 1 FROM B WHERE B.key_col1=A.key_col1 AND B.key_col2=A.key_col2)
楼主 是不是要这样 insert a(id,num)--计算列插入A表 select id, sum(num) from tupdate b有就更新 set num=a.num from a where b.id=a.idinsert b--没有就插入 select * from a where not exists(select 1 from b where id=a.id)
select a.id id1,b.id id2 into #t from a left join b on a.id = b.idinsert into b(列) select 列 from a inner join #t c on a.id = c.id1 where c.id2 is nullupdate b set ********************** from a,#t c where a.id = c.id1 and c.id2 is not null
分在两地的话,最好先把A表传到B表所在的服务器上再做。根据你的需求,应该只是做insert就够了 ---将A copy到本地 select into #A from [....].Ainsert B(col1,col2...) select A.col1,A.col2... from #A A left join B on A.id = B.id where B.id is null对于大数据量的更新操作,如果要用事务记得一定要先做Update再做Insert,因为如果Update出错了,回滚的时间会相当的长。如果超大数据量的更新,就不得不考虑到表上索引对更新效率的影响了,如果是每天做批量,不影响业务的话,可以将rename B表,然后B表和#A表做Union插入另一张C表,在C表上重建索引后rename为A表。
更正: 在C表上重建索引后rename为B表
链接服务器+INSET into B SELECT * FROM LinkServer.dbo.A where NOT EXISTS (SELECT 1 FROM B WHERE 主键=A.主键 )
SET B.value_col1=A.value_col1
,B.value_col2=A.value_col2
...
FROM A, B
WHERE B.key_col1=A.key_col1
AND B.key_col2=A.key_col2--插入不存在的
INSERT INTO B
(col1, col2, col3, ... )
SELECT col1, col2, col3, ...
FROM A
WHERE NOT EXISTS
(SELECT 1
FROM B
WHERE B.key_col1=A.key_col1
AND B.key_col2=A.key_col2)
UPDATE B
SET B.value_col1=A.value_col1
,B.value_col2=A.value_col2
...
FROM A, B
WHERE B.key_col1=A.key_col1
AND B.key_col2=A.key_col2--插入不存在的
INSERT INTO B
(col1, col2, col3, ... )
SELECT col1, col2, col3, ...
FROM A
WHERE NOT EXISTS
(SELECT 1
FROM B
WHERE B.key_col1=A.key_col1
AND B.key_col2=A.key_col2)
是不是要这样
insert a(id,num)--计算列插入A表
select id, sum(num) from tupdate b有就更新
set num=a.num
from a where b.id=a.idinsert b--没有就插入
select * from a where not exists(select 1 from b where id=a.id)
select 列 from a inner join #t c on a.id = c.id1 where c.id2 is nullupdate b
set **********************
from a,#t c
where a.id = c.id1 and c.id2 is not null
------------------------------------------------------------------------
如果A、B两个表分别在不同的服务器上,使用链接服务器方式来做。如之前诸位所描述,只需要不超过两条SQL语句就可以解决这个问题。
---将A copy到本地
select into #A from [....].Ainsert B(col1,col2...)
select A.col1,A.col2...
from #A A left join B on A.id = B.id
where B.id is null对于大数据量的更新操作,如果要用事务记得一定要先做Update再做Insert,因为如果Update出错了,回滚的时间会相当的长。如果超大数据量的更新,就不得不考虑到表上索引对更新效率的影响了,如果是每天做批量,不影响业务的话,可以将rename B表,然后B表和#A表做Union插入另一张C表,在C表上重建索引后rename为A表。
在C表上重建索引后rename为B表
SELECT * FROM LinkServer.dbo.A where NOT EXISTS (SELECT 1 FROM B WHERE 主键=A.主键 )