入库明细表guid 入库单号 材料编号 材料名称     数量 
1      d1       cx001   cxoo1name    3
2      d1       cx002   cx002name     2
3      d1       cx003    cx003name    5库存表guid   库房  材料编号      数量
1       KF1    cx001        10    ---原来有7个,入库更新:7+3
2       KF1    cx002        2     ---原来没有, 入库插入记录
3       KF2    cx003         12   ---原来有7个,入库更新:7+5

解决方案 »

  1.   

    -- =============================================
    -- Author:      T.O.P
    -- Create date: 2009/11/26
    -- Version:     SQL SERVER 2005
    -- =============================================
    declare @TB1 table([guid] int,[入库单号] varchar(2),[材料编号] varchar(5),[材料名称] varchar(9),[数量] int)
    insert @TB1
    select 1,'d1','cx001','cxoo1name',3 union all
    select 2,'d1','cx002','cx002name',2 union all
    select 3,'d1','cx003','cx003name',5declare @TB2 table([guid] int,[库房] varchar(3),[材料编号] varchar(5),[数量] int)
    insert @TB2
    select 1,'KF1','cx001',7 union all
    select 2,'KF1','cx002',0 union all
    select 3,'KF2','cx003',7update b
    set b.[数量] = b.[数量]+a.[数量]
    FROM @TB1 A INNER JOIN @TB2 B ON A.GUID = B.GUID
    AND A.[材料编号] = B.[材料编号]SELECT * FROM @TB2
    --测试结果:
    /*
    guid        库房   材料编号  数量
    ----------- ---- ----- -----------
    1           KF1  cx001 10
    2           KF1  cx002 2
    3           KF2  cx003 12(3 row(s) affected)*/
      

  2.   

    guid是主键...我只是随便写的一个1,2,3,两张表的guid根本不可能一样...
    还有,库存表里没有数量为0的记录
      

  3.   

    ---按照下面的写的
    写触发器 有可能能用到这个
    update b
    set b.[数量] = b.[数量]+a.[数量]
    FROM TB1 A INNER JOIN TB2 B ON A.[材料编号] = B.[材料编号]
      

  4.   

    那不用GUID, 只用材料编号行不行??
      

  5.   

    --> 测试数据:  入库明细表
    if object_id('入库明细表') is not null drop table 入库明细表
    go 
    create table 入库明细表 (guid int,入库单号 varchar(3),材料编号 varchar(5),材料名称 varchar(20),数量 int )
    --> 测试数据:  库存表
    if object_id('库存表') is not null drop table 库存表
    go 
    create table 库存表 (guid int,库房 varchar(3),材料编号 varchar(5),数量 int )
    insert into 库存表
    select 1,'KF1','cx001',7  union all
    select 3,'KF2','cx003',7  
    /*
    guid 入库单号 材料编号 材料名称    数量 
    1      d1      cx001  cxoo1name    3 
    2      d1      cx002  cx002name    2 
    3      d1      cx003    cx003name    5 
    */
    if object_id('trig') is not null drop trigger trig
    go 
    create trigger trig on 入库明细表
    for insert 
    as
      if exists(select 1 from 库存表 k,inserted i where i.材料编号=k.材料编号) 
    update 库存表
    set 数量=a.数量+i.数量
    from 库存表 a,inserted i
    where i.材料编号=a.材料编号  else
    insert 库存表 select i.guid,'KF1',i.材料编号,i.数量 from inserted igo 
    insert 入库明细表 select 1,'d1','cx001','cxoo1name',3 
    select * from  库存表
     insert 入库明细表 select 2,'d1','cx002','cxoo2name',2 
    select * from  库存表
    insert 入库明细表 select 3,'d1','cx003','cxoo3name',5 
    select * from  库存表
    guid        库房   材料编号  数量
    ----------- ---- ----- -----------
    1           KF1  cx001 10
    3           KF2  cx003 12
    2           KF1  cx002 2(3 行受影响)
    自己参考参考
      

  6.   

    update 库存表 set 库存表.数量=库存表.数量+入库明细表.数量
    from 库存表 inner join 入库明细表
    on 库存表.材料编号=入库明细表.材料编号
      

  7.   


    没有0的那一条, 那就只好先更新, 然后将没有的插进去了!--=============================================
    -- Author:      T.O.P
    -- Create date: 2009/11/26
    -- Version:     SQL SERVER 2005
    -- =============================================
    declare @TB1 table([guid] int,[入库单号] varchar(2),[材料编号] varchar(5),[材料名称] varchar(9),[数量] int)
    insert @TB1
    select 1,'d1','cx001','cxoo1name',3 union all
    select 2,'d1','cx002','cx002name',2 union all
    select 3,'d1','cx003','cx003name',5declare @TB2 table([guid] int,[库房] varchar(3),[材料编号] varchar(5),[数量] int)
    insert @TB2
    select 1,'KF1','cx001',7 union all
    select 3,'KF2','cx003',7update b
    set b.[数量] = b.[数量]+a.[数量]
    FROM @TB1 A INNER JOIN @TB2 B ON A.[材料编号] = B.[材料编号]insert into @tb2
    select 2,'KF1',A.[材料编号], A.[数量]
    FROM @TB1 A LEFT JOIN @TB2 B ON A.[材料编号] = B.[材料编号]
    WHERE B.[材料编号] IS NULLSELECT * FROM @TB2 ORDER BY GUID
    --测试结果:
    /*
    guid        库房   材料编号  数量
    ----------- ---- ----- -----------
    1           KF1  cx001 10
    2           KF1  cx002 2
    3           KF2  cx003 12(3 row(s) affected)*/
      

  8.   

    论坛是不是改版了。看着代码变大了,sql code 还没有那个大框框
      

  9.   


    --写一个触发器
    if object_id('入库明细表') is not null
       drop table 入库明细表
    go
    create table 入库明细表(guid int ,入库单号 varchar(10),材料编号 varchar(10),材料名称 varchar(10),数量 int)
    go
    if object_id('库存表') is not null
       drop table 库存表
    go
    create table 库存表(guid int,库房 varchar(10),材料编号 varchar(10),数量 int)
    go
    insert into 库存表
    select 1,'KF1','cx001',7 union all
    select 3,'KF2','cx003',7
    go
    if object_id('tr_updatesl') is not null
       drop trigger tr_updatesl
    go
    create trigger tr_updatesl on 入库明细表
    for insert
    as
    select a.* from 库存表 a inner join inserted b on a.guid=b.guid
    if @@rowcount>0
       update 库存表 set 数量=a.数量+b.数量 from 库存表 a,inserted b where a.guid=b.guid
    else
       insert into 库存表 select guid,'KF1',材料编号,数量 from inserted
    goinsert into 入库明细表 select 1,'d1','cx001','cxoo1name',3
    insert into 入库明细表 select 2,'d1','cx002','cxoo2name',2
    insert into 入库明细表 select 3,'d1','cx003','cxoo3name',5select * from 库存表 order by guid
      

  10.   

    --先update再插入库存表中无的记录
    --假设guid为自增列,如不是,插入前必需先查询最大guid
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE --将事务隔离级别设为最高
    begin tran 
    update a
    set 数量=a.数量+b.数量
    from 库存表 a,入库明细表 b
    where a.材料编号=b.材料编号 and a.库房='kF1'insert into 库存表 (库房,材料编号,数量)
    select 'KF1',材料编号,数量
    from 入库明细表 a where not exists(select * from 库存表 where 库房='KF1' and 材料编号=a.材料编号)
    commit tran