在一个表中有15个字段(a1---a15),其中有的记录中a6--a10字段有数据,有的没有,我想用有数据的记录中的A6--A10去填充那些没有数据的记录,怎么写SQL?我用的ACCESS,我复制了一个表,想这样用,可是不行,怎么做?
update tjjg set wbc=a.wbc,lym=a.lym,mon=a.mon,gra=a.gra,lymb=a.lymb,monb=a.monb,grab=a.grab,rbc=a.rbc,hgb=a.hgb,hct=a.hct,mcv=a.mcv,mch=a.mch,mchc=a.mchc,rdw=a.rdw,plt=a.plt,mpv=a.mpv,pct=a.pct,pdw=a.pdw from tjjg,tjjg1(为复制的表) a where a.wbc<>'' and tjjg.dw like
update tjjg set wbc=a.wbc,lym=a.lym,mon=a.mon,gra=a.gra,lymb=a.lymb,monb=a.monb,grab=a.grab,rbc=a.rbc,hgb=a.hgb,hct=a.hct,mcv=a.mcv,mch=a.mch,mchc=a.mchc,rdw=a.rdw,plt=a.plt,mpv=a.mpv,pct=a.pct,pdw=a.pdw from tjjg,tjjg1(为复制的表) a where a.wbc<>'' and tjjg.dw like
我用了两个memo来作为写SQL语句的地方,连接两个不同数据库,第一个只用来查询,第二个也可查询也可将第一个查询的结果写入,代码如下://将ADOQUERY1的数据全部写入ADOQUERY2(字段格式相同)
procedure TForm1.Button2Click(Sender: TObject);
var s2:string;//
begin
s2:=memo2.Text;
Try
ADOConnection2.Connected:=true;
except
messagedlg('目标数据库未打开!',mtError,[mbOK],0);
abort;
end;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add(s2);
adoquery2.Open;
while not(adoquery1.eof) do
begin
adoquery2.Insert;
for i:=0 to adoquery1.fieldcount-1 do
begin
adoquery2.Fields[i].AsString:=adoquery1.fields[i].asstring;
end;
adoquery1.next;
i:=i+1;
end;
adoquery2.Post;
ADOquery2.Close;
end;
这样插入可以(insert),但我这样用来修改(把insert改成edit)就不行,同一条记录影响到多行,我的目的是一行换一行啊。为什么?怎么做?不够加分。
update kkk set a2 = (select top 1 a2 from kkk where a2 is not null) where a2 is null
--上面是我做测试用的不需要用两个表。你用下面的试试:update tjjg set a6 = (select top 1 a6 from kkk where a6 is not null) where a6 is null把a6到a10中每个字段都执行一次update
update tjjg set a6 = (select top 1 a6 from tjjg where a6 is not null) where a6 is null
update tjjg set a7 = (select top 1 a7 from tjjg where a7 is not null) where a7 is null
update tjjg set a8 = (select top 1 a8 from tjjg where a8 is not null) where a8 is null
………………把a6到a10中每个字段都执行一次update
我是想用有数据的好多条记录去填充那些没有数据的列,而且填充后的数据不能是相同的。
如:用id 为1 和2 的两条记录中的值去填充 ID为27、28中的A6--A10
ID A6 A7 A8 A9 A10 ID A6 A7 A8 A9 A10
1 3.2 2.1 0.35 2.8 0.56 27 3.2 2.1 0.35 2.8 0.56
2 2.95 3.1 0.56 2.57 0.64 28 2.95 3.1 0.56 2.57 0.64顺便帮我看一下我的那个程序中的错误。
while not(adoquery1.eof) do
begin
adoquery2.Insert;
for i:=0 to adoquery1.fieldcount-1 do
begin
adoquery2.Fields[i].AsString:=adoquery1.fields[i].asstring;
end;
adoquery1.next;
/////////////////i:=i+1;////这里把i:=i+1;去掉
end;
adoquery2.Post;//////////这里把post改在循环里面
ADOquery2.Close;
var s2:string;
begin
s2:=memo2.Text;
Try
ADOConnection2.Connected:=true;
except
messagedlg('目标数据库未打开!',mtError,[mbOK],0);
abort;
end;
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add(s2);
adoquery2.Open;
while not(adoquery1.eof) do
begin
adoquery2.edit;
for i:=1 to adoquery1.fieldcount-1 do //改成=1是为了观察ID号
begin
adoquery2.Fields[i].AsString:=adoquery1.fields[i].asstring;
end;
adoquery2.Post;
adoquery2.Next;//加了个这个向下滚动
adoquery1.next;
end;
ADOquery2.Close;
end;
改成这样行了,update可能达不到目的。
准备结了。谢谢大家。
-----------------------------------------------------------------------------
是用任一个有数据的记录去填充没有记录的,还是有什么特别的条件-----------------------------------------------------------------------------
如果是任一个就简单啦,找一个有记录的,记录下A6-a10的值
再update就行
用这个方法应该是不行的,我要求的是A6=A6,A7=A7......A10=A10。所以update可能不好用。谢谢大家。
另问一句,用ADOConnection连接一个*.dbf文件怎么写adoconnection.ConnectionString?
其实我的意思 是这样的:
就像在EXECL中将[sheet1]中的A1:J15区域中的数据复制后粘贴到[sheet1]中的A16:J30间的空白区域中,大家试一下看看。
谢谢大家。快结帖了。