问题1
有2个表,GOODS,产品资料表,STOREMAIN,库存表,
库存表里存放多个仓库的库存,用字段:STOR_NAME标识
现在要实现把产品资料里有,而库存某一仓库没有的产品导入库存对应的仓库里面
由于产品资料数据很多1万多条,4个分仓就有4万条记录,用NOT IN 语句可以实现,可时间非常长,约30分钟,知道用NOT EXISTS,可以很快,希望改成后者GOODS:
  GODS_CODE:产品编码
    01
    02
.........STOREMAIN:
  产品编码:GODS_CODE  产品数量:gods_amou 仓库编号:stor_name
      01                   0                        1
      02                   0                        1
      02                   0                        2 
............
现在要把产品编号为01的加到2号仓库里
用以下not in语句实现
          with frmdatamod.TempQ  do
            begin
              Close;
              SQL.Clear;
              SQl.Add('insert into storemain (gods_amou,stor_name,gods_code) ') ;
              SQL.Add(' SELECT :gods_amou ,:stor_name,gods_code ');
              SQL.Add(' FROM goods   ');
              SQL.Add(' WHERE gods_code not in (select gods_code ');
              SQL.Add(' from storemain  where stor_name=:stor_name2 ) ');
              Parameters.ParamByName('gods_amou').Value:=0;
              Parameters.ParamByName('stor_name').Value:=upublic.stor_name;
              Parameters.ParamByName('stor_name2').Value:=upublic.stor_name;
              ExecSQL;
            end;
改成not exists
          with frmdatamod.TempQ  do
            begin
              Close;
              SQL.Clear;
              SQl.Add('insert into storemain (gods_amou,stor_name,gods_code) ') ;
              SQL.Add(' SELECT :gods_amou ,:stor_name,gods_code ');
              SQL.Add(' FROM goods   ');
              SQL.Add(' WHERE not exists (select gods_code ');
              SQL.Add(' from storemain  where goods.gods_code=storemain.gods_code and storemain.stor_name=:stor_name2 ) ');
              Parameters.ParamByName('gods_amou').Value:=0;//置库存0
              Parameters.ParamByName('stor_name').Value:=upublic.stor_name;
              Parameters.ParamByName('stor_name2').Value:=upublic.stor_name;
              ExecSQL;
            end;
注:upublic.stor_name表示当前对应的仓库编号问题2:
   有一客户想了解员工的收发邮件情况,员工的邮箱都是同一域名下的,可以设置每一邮箱帐号转发的经理邮箱即可,但怎么可以截获员工发出去的邮件呢(如果硬让员工抄送是不可能的),请问可以用什么软件实现呢,尽量不要EXCHANGE SERVER,负荷太大,有一台2000SERVER服务器,ADSL上网,没有固定IP的

解决方案 »

  1.   

    续:改成not exists 后所有的产品都会到入到相应的仓库编码一次,如果去掉goods.gods_code=storemain.gods_code ,则一条记录也导不进来,请问该如何解决
      

  2.   

    如果需要对每个仓库编号都增添,那SQL语句如下:
    insert into stormain(gods_amou,stor_name,gods_code)
    select 0 as gods_amou,a.stor_name,a.gods_code
    from
    (
       select distinct goods.gods_code,stormain.stor_name
       from goods
       cross join  stormain
    )as a
    where 
       not exists(select * from  stormain 
                  where gods_code=a.gods_code and stor_name=a.stor_name)
    -------------------------------------------------------------------
    只对单个仓库编号增添:
    insert into stormain(gods_amou,stor_name,gods_code)
    select 0 as gods_amou,:stor_name,goods.gods_code
    from
    goods
    where 
    not exists(select * from  stormain where gods_code=goods.gods_code and stor_name=:stor_name2)
    -------------------------
    参数stor_name和stor_name2自己从程序带入。
      

  3.   

    对于第二个问题只能附加于Exchage Server上面,即使邮件代理.
      

  4.   

    多谢:unsigned(僵哥)
    第一个问题已经解决,
    第2个问题,问了一个搞过Exchage Server的,他说只能控制接受接收,发送没办法的
    能说具体点吗?
      

  5.   

    insert into storemain (gods_amou,stor_name,gods_code)
    SELECT a.gods_amou , b.stor_name, a.gods_code
    FROM goods a, (select distinct gods_amou, stor_name) b
    WHERE a.gods_amou=b.gods_amou
      and not Exists(select 1 from from storemain where gods_amou=a.gods_amou and stor_name=b.stor_name )
      

  6.   

    sorry 上面的那个写错了,看看下面的是否合用:
     --(select distinct stor_name from storemain) b  应该改成你的仓库编码列表
    insert into storemain (gods_amou,stor_name,gods_code)
    SELECT 0 as gods_amou , b.stor_name, a.gods_code
    FROM goods a, (select distinct stor_name from storemain) b
    WHERE not Exists(select 1 from from storemain where gods_code=a.gods_code and stor_name=b.stor_name )