B表批量更新A表,A表记录不存在则插入新记录
本帖最后由 zl_c 于 2013-05-30 13:39:55 编辑 A表
------------------
idtotal
1100.00
250.00
3320.00
B表
-------------------
idprice
110.00
318.00
415.00
现需要将B表price加到A表的对应ID的total里去,如果A表没有这个ID,则在A表插入新ID记录且将prize保存到total字段。希望能用一句SQL实现。
update Atable A set total=total+B.price from BTable B where A.id=B.id--这只更新了A表中已有的ID。
--------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-25 01:10:28
-- Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:38
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
-- Blog : http://blog.csdn.net/htl258
-- Subject: SQL2008 Merge关键字用法与简例
--------------------------------------
--Merge 语法是对表进行插入,更新,删除这三个操作的合并。
--根据与源表联接的结果,对目标表执行插入、更新或删除操作。
--MERGE 语法包括如下五个主要子句:
-- MERGE 子句用于指定作为插入、更新或删除操作目标的表或视图。
-- USING 子句用于指定要与目标联接的数据源。
-- ON 子句用于指定决定目标与源的匹配位置的联接条件。
-- WHEN 子句用于根据ON 子句的结果指定要执行的操作。
-- OUTPUT 子句针对更新、插入或删除的目标对象中的每一行返回一行。
--示例:
USE tempdb
GO
--创建表A
IF NOT OBJECT_ID('[A]') IS NULL
DROP TABLE [A]
GO
CREATE TABLE A(ID INT,ACOL VARCHAR(10))
GO
INSERT A VALUES(1,N'A')
INSERT A VALUES(2,N'B')
INSERT A VALUES(3,N'C')
INSERT A VALUES(6,N'X') --此记录在B表中不存在,删除
GO
--创建表B
IF NOT OBJECT_ID('[B]') IS NULL
DROP TABLE [B]
GO
CREATE TABLE B(ID INT,BCOL VARCHAR(10),XCOL VARCHAR(10))
GO
INSERT B VALUES(1,N'A',N'T') --1的ID与A表ID匹配且指定值与A表指定值对应相同,不变
INSERT B VALUES(2,N'P',N'O') --2和的ID与A表ID匹配,指定值与A表指定值对应不同,更新
INSERT B VALUES(3,N'P',N'N')
INSERT B VALUES(4,N'L',N'Y') --4和的ID与A表ID匹配,指定值在A表中对应不存在,插入
INSERT B VALUES(5,N'E',N'S')
GO
--开始合并两个表:
MERGE A --要处理的表
USING B --参照的表
ON A.ID=B.ID --关联条件
WHEN NOT MATCHED THEN INSERT VALUES(B.ID,B.BCOL) --如果要处理表没有参照表上的记录,则插入
WHEN MATCHED THEN UPDATE SET A.ACOL=B.BCOL --如果记录匹配,就更新目标表的匹配行
WHEN NOT MATCHED BY SOURCE THEN DELETE --如果要处理表的记录在参照表上不存在,则删除
OUTPUT $action, Inserted.*, Deleted.*; --相当于输出以上语句的操作记录
/*--result:
$action ID ACOL ID ACOL
---------- ----------- ---------- ----------- ----------
INSERT 4 L NULL NULL
INSERT 5 E NULL NULL
UPDATE 1 A 1 A
UPDATE 2 P 2 B
UPDATE 3 P 3 C
DELETE NULL NULL 6 X
(6 行受影响)
*/
--看看A表更新成什么样:
SELECT * FROM A
/*
ID ACOL
----------- ----------
1 A
2 P
3 P
4 L
5 E
(5 行受影响)
*/
--再变换一个字段
MERGE A --要处理的表
USING B --参照的表
ON A.ID=B.ID --关联条件
WHEN NOT MATCHED THEN INSERT VALUES(B.ID,B.XCOL)
WHEN MATCHED THEN UPDATE SET A.ACOL=B.XCOL
WHEN NOT MATCHED BY SOURCE THEN DELETE
OUTPUT $action, Inserted.*, Deleted.*;
/*--result:
$action ID ACOL ID ACOL
---------- ----------- ---------- ----------- ----------
UPDATE 1 T 1 A
UPDATE 2 O 2 P
UPDATE 3 N 3 P
UPDATE 4 Y 4 L
UPDATE 5 S 5 E
(5 行受影响)
*/
--再看看现在的A表像什么样
SELECT * FROM A
/*
ID ACOL
----------- ----------
1 T
2 O
3 N
4 Y
5 S
(5 行受影响)
*/
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/htl258/archive/2010/04/25/5525814.aspx
再者可以通过存储过程的if 判断来实现
--查询
select isnull(a.id,b.id)id,isnull(total,0)+isnull(B.price,0)total from a full join b on a.id = b.id
go
select * from a
go
--修改
update A set total=isnull(total,0)+isnull(B.price,0) from B where A.id=B.id
go
with t as
(
select isnull(a.id,b.id)id,isnull(B.price,0)price from a full join b on a.id = b.id
)
,t1 as
(
select t.id,t.price from t left join a on t.id = a.id where a.id is null
)
insert into a select id,price from t1
go
select * from a