declare @dateX smalldatetime set @dateX = '2001-1-3' --求月首:select @dateX-day(@dateX)+1
to 大力:好象不对 不是第一日的insert into 语句因该把表1增加的记录且增加的记录中字段a3不等于2的 (a1,a2,a4)写进表2,或者是表1中原先字段a3变为非2的记录写进表2.
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
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 查询结果不对。
哪里不对?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
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
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过的记录,不能重复再进。
当月已insert into 进表2的表1记录不用查询出来,只查询并插入未进表2的符合a3不等于2的 表1记录。
如果每月都只执行一次非第一日的insert就有解了,如果不.....
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
不是吗?如果1号没有呢?
set @dateX = '2001-1-3'
--求月首:select @dateX-day(@dateX)+1
不是第一日的insert into 语句因该把表1增加的记录且增加的记录中字段a3不等于2的
(a1,a2,a4)写进表2,或者是表1中原先字段a3变为非2的记录写进表2.
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
查询结果不对。
(select min(b.b3) from 表1) and a.a3<>2
查询出3000多条记录,而表1中总共才100多个记录。
我猜了半天也没猜出你要什么你举个例吧!如:
a b
-------
1 2
4 3
要得到
a b
-----
1 2
表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
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
每次运行这个语句,结果把已经进表2的记录又查询出来,重复插进表2,而当月已insert
into 进表2过的记录,不能重复再进。
表1记录。
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
刚刚学习SQL 2000,在这学到不少东西。
再次谢谢大力的帮助!