日期:2014-05-17  浏览次数:20611 次

B表批量更新A表,A表记录不存在则插入新记录
本帖最后由 zl_c 于 2013-05-30 13:39:55 编辑
A表
------------------
id total
1 100.00
2 50.00
3 320.00

B表
-------------------
id price
1 10.00
3 18.00
4 15.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。


希望最后A表的结果是:
------------------
id total
1 110.00
2 50.00
3 338.00
4 15.00

------解决方案--------------------
如果是2008的话可以尝试MERGE语法
http://www.cnblogs.com/CareySon/archive/2012/03/07/2383690.html
------解决方案--------------------
先检测再更新,笨办法。
------解决方案--------------------
--------------------------------------

--  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表指定值对应不同,更新