insert 表2(b1,b2,b3,b4) select a1,a2,(getdate()),a4 from 表1 where b3 not in (select min(b3) from 表1)

解决方案 »

  1.   

    问题的关键是获得每月第一天的日期值,然后在筛选时取当月不等于第一天的日期,方法有两种,一是用YEAR和MONTH取得年和月,再加上日1组合成日期值,还有直接判断时采用DATEADD,但第二种方法写法比较复杂。
      

  2.   

    not in (select min(b3) from 表1)
    不是吗?如果1号没有呢?
      

  3.   

    declare @dateX smalldatetime
    set @dateX = '2001-1-3'
    --求月首:select @dateX-day(@dateX)+1
      

  4.   

    to 大力:好象不对
    不是第一日的insert into 语句因该把表1增加的记录且增加的记录中字段a3不等于2的
    (a1,a2,a4)写进表2,或者是表1中原先字段a3变为非2的记录写进表2.
      

  5.   

    insert 表2(b1,b2,b3,b4) select a1,a2,(getdate()),a4 from 表1 where b3 not in (select min(b3) from 表1) and a3<>2
      

  6.   

    to 大力: 根据:
    insert 表2(b1,b2,b3,b4) select a1,a2,(getdate()),a4 from 表1 where b3 not in (select min(b3) from 表1) and a3<>2
    把没进表2的记录查询出来的语句为:
    select a.a1,a.a2,(getdate()),a.a4 from 表1 a,表2 b where b.b3 not in 
    (select min(b.b3) from 表1) and a.a3<>2
    查询结果不对。
      

  7.   

    哪里不对?select a.a1,a.a2,(getdate()),a.a4 from 表1 a,表2 b where convert(char(6),b.b3,112)=convert(char(6),getdate(),112) and b.b3 not in 
    (select min(b.b3) from 表1) and a.a3<>2
      

  8.   

    加:convert(char(6),b.b3,112)=convert(char(6),getdate(),112) 条件
    查询出3000多条记录,而表1中总共才100多个记录。
      

  9.   

    select * from 表1 where a3<>2 and a5 not in (select min(a5) from 表1 where convert(char(6),a5,112)=convert(char(6),getdate(),112)) ??select a1,a2,(getdate()),a4 from 表1 where a3<>2 and not exists (select 1 from 表2 where 表2.b1=表1.a1 and 表2.b2=表1.a2 and 表2.b4=表1.a4)??
    我猜了半天也没猜出你要什么你举个例吧!如:
    a  b
    -------
    1  2
    4  3
    要得到
    a  b
    -----
    1  2
      

  10.   

    例:
    表1
     a1   a2   a3    a4        a5
    111  222   2    333   2003-5-24 10:00
    aa1  aa2   1    aa4   2003-5-28 10:00 
    bb1  bb2   1    bb4   2003-6-1  10:00
    cc1  cc2   1    cc4   2003-6-1  10:00
    dd1  dd2   1    dd4   2003-6-2  10:00
    ee1  ee2   1    ee4   2003-6-4  10:00  表2
     b1   b2       b3       b4     
    aa1  aa2   2003-5-29   aa4  
    aa1  aa2   2003-6-1    aa4
    bb1  bb2   2003-6-1    bb4 
    cc1  cc2   2003-6-1    cc4  上个月2003-5-29运行过“现在要完成的insert into 语句”后表2添加记录:
    aa1  aa2   2003-5-29   aa4 
    在2003-6-1已运行过
    insert into 表2(b1,b2,b3,b4) select a1,a2,(getdate()),a4 from 表1 where a3<>2
    语句后表2又添加记录:
    aa1  aa2   2003-6-1    aa4
    bb1  bb2   2003-6-1    bb4 
    cc1  cc2   2003-6-1    cc4  
    现在想把表1中的
    dd1  dd2   1    dd4   2003-6-2  10:00
    ee1  ee2   1    ee4   2003-6-4  10:00  
    两个记录(或者以后继续增加的符合a3不等于2的记录)查询出来并把表1中查询出来的记录
    (a1,a2,a4)添加到表2 中并给b3付值为当日日期即:
    表2在2003-6-6日运行完“现在要完成insert into语句”后添加:dd1 dd2  2003-6-6   dd4
    ee1 ee2  2003-6-6   ee4两条记录,即表2内容变为:
     b1   b2       b3       b4     
    aa1  aa2   2003-5-29   aa4  
    aa1  aa2   2003-6-1    aa4
    bb1  bb2   2003-6-1    bb4 
    cc1  cc2   2003-6-1    cc4  
    dd1  dd2   2003-6-6    dd4
    ee1  ee2   2003-6-6    ee4
      

  11.   

    create table #表1(a1 varchar(3),a2 varchar(3), a3 int, a4  varchar(3),      a5 datetime)
    insert #表1 values('111','222',   2    ,'333',   '2003-5-24 10:00')
    insert #表1 values('aa1','aa2',   1    ,'aa4' ,  '2003-5-28 10:00')
    insert #表1 values('bb1','bb2',   1   , 'bb4'  , '2003-6-1  10:00')
    insert #表1 values('cc1','cc2',   1  ,  'cc4'   ,'2003-6-1  10:00')
    insert #表1 values('dd1','dd2',   1 ,   'dd4'  , '2003-6-2  10:00')
    insert #表1 values('ee1','ee2',   1,    'ee4'  , '2003-6-4  10:00') create table #表2(b1 varchar(3),b2  varchar(3), b3 datetime,       b4     varchar(3))
    insert #表2 values('aa1','aa2','2003-5-29','aa4') 
    insert #表2 values('aa1','aa2','2003-6-1','aa4')
    insert #表2 values('bb1','bb2','2003-6-1','bb4') 
    insert #表2 values('cc1','cc2','2003-6-1','cc4')insert #表2 select a1,a2,getdate(),a4 from #表1 where datediff(month,a5,getdate())=0 and CONVERT(varchar(10),a5,120)<>CONVERT(varchar(10),getdate()-day(getdate())+1,120)go
    drop table #表1,#表2
      

  12.   

    insert #表2 select a1,a2,getdate(),a4 from #表1 where datediff(month,a5,getdate())=0 and CONVERT(varchar(10),a5,120)<>CONVERT(varchar(10),getdate()-day(getdate())+1,120)
    每次运行这个语句,结果把已经进表2的记录又查询出来,重复插进表2,而当月已insert 
    into 进表2过的记录,不能重复再进。
      

  13.   

    当月已insert into 进表2的表1记录不用查询出来,只查询并插入未进表2的符合a3不等于2的
    表1记录。
      

  14.   

    如果每月都只执行一次非第一日的insert就有解了,如果不.....
      

  15.   

    create table #表1(a1 varchar(3),a2 varchar(3), a3 int, a4  varchar(3),      a5 datetime)
    insert #表1 values('111','222',   2    ,'333',   '2003-5-24 10:00')
    insert #表1 values('aa1','aa2',   1    ,'aa4' ,  '2003-5-28 10:00')
    insert #表1 values('bb1','bb2',   1   , 'bb4'  , '2003-6-1  10:00')
    insert #表1 values('cc1','cc2',   1  ,  'cc4'   ,'2003-6-1  10:00')
    insert #表1 values('dd1','dd2',   1 ,   'dd4'  , '2003-6-2  10:00')
    insert #表1 values('ee1','ee2',   1,    'ee4'  , '2003-6-4  10:00') create table #表2(b1 varchar(3),b2  varchar(3), b3 datetime,       b4     varchar(3))
    insert #表2 values('aa1','aa2','2003-5-29','aa4') 
    insert #表2 values('aa1','aa2','2003-6-1','aa4')
    insert #表2 values('bb1','bb2','2003-6-1','bb4') 
    insert #表2 values('cc1','cc2','2003-6-1','cc4')insert #表2 select a1,a2,getdate(),a4 from #表1 where datediff(month,a5,getdate())=0 and 
    CONVERT(varchar(10),a5,120)<>CONVERT(varchar(10),getdate()-day(getdate())+1,120)
    and not exists (select 1 from #表2 where #表1.a1=#表2.b1 and #表1.a2=#表2.b2 and #表1.a4=#表2.b4)select * from #表2
    go
    drop table #表1,#表2
      

  16.   

    解决了!
    刚刚学习SQL 2000,在这学到不少东西。
    再次谢谢大力的帮助!