两种办法
一是用游标,在第一张表里一条一条定位,每定位一条,就到第二张表里去判断存不存在,然后作出相应操作;
二是把第一张表和第二张表进行left/right join,这样可以一次性把第一张表所有数据分成两部分,存在的和不存在(于第二张表内)的,对存在的那部分数据做update操作,不存在的做insert操作

解决方案 »

  1.   

    可以用游标一条一条处理,不过你要是说清楚表结构和要求,可能不必用游标:
    begin trans
        update ...
        set ...
        from ...
        where ..
           and exists (...)
        ...
       
        insert ...
        select ...
        from ...
        where ...
           and not exists (...)
        ...    insert Table3
        select ...commit trans
    以上示意,在没有表结构的情况下已经相当清楚了!!
      

  2.   

    谢谢: shinebei(灰灰)
      用游标是否有几个字段就定义几个变量,然后滚动游标,付值给变量,在用
      update或insert
      

  3.   

    我做的是一个库存出库程序,所以:
    1。要出库的产品在临时表中。
    2。遍历临时表,判断库存表是否够出库(库存数大于出库数)
    3。够出库,写记录到二级库,判断二级库有无该产品,有数量update;
       无insert
    4。insert到名细表
    请问,该如何写存储过程?
      

  4.   

    这个过程,我是这样想的:每次出库,出库数和出库商品是两个必须要知道的条件,所以是不是把这两个作为输入参数:@num, @sp
    判断一下库中该商品哪些记录是满足出库的:
    select * from kcb where sp= @sp and kcs> @num  这里的记录集暂称之A
    [kcb:库存表;sp:商品;kcs:库存数]
    如果有的话,把这些满足条件的记录集放到一个新的临时表里:
    select * into #temp from kcb where sp= @sp and kcs> @num
    再把二级库里该商品记录集放入#temp(这段记录集暂称为B),同时删除二级库中该商品的记录集(过程结束前会把该商品记录从#temp里回导入二级库内,因为这个时候#temp里的数据都是同一种商品的信息)
    此做法的思路:为了避免用到游标,把A和B都放在#temp里,接下来就sum(kcs)和group by语法对#temp里的数据进行统计累加,累加结果直接回导入二级库。这样做的优点有:因为用游标的话,要到二级库去一条条判断,是否有无该产品,根据判断结果要作相应的update或insert操作。如果把该产品的新旧数据都放到#temp中,只要最后用insert into 二级库表 select sp,....,sum(kcs) from #temp group sp就行了。记得一点,在把二级库数据放到#TEMP表中后,要把二级库表中的相应记录先删掉,要不然,过程结束时,数据导回来就会造成重复记录了