综合叙述:遍历A表,根据SN号码去查找B表,如何这个SN号码的记录存在就把这条记录的3个字段的值取出来,联合A表中的几个字段的值,最后写入C表。delphi代码如下:
//先把adoquery1和A表关联起来
with adoquery1 do
begin
if active=true then close;
SQL.Clear;
tempsql:='select * from tempinfordone';
sql.Add(tempsql);
prepared:=true;
open;
end; adoquery1.first; //A表指针从0开始 with adoquery2 do
begin
while not(adoquery1.Eof) do
begin
if active=true then close;
SQL.Clear;
//所有字段准备
tempsn:=adoquery1.fieldbyname('SN').AsString;
tempMobileType:=adoquery1.fieldbyname('MobileType').AsString;
tempMalCode:=adoquery1.fieldbyname('MalCode').AsString;
tempwhereis:=adoquery1.fieldbyname('whereIs').AsString;
tempAnalyst:=adoquery1.fieldbyname('Analyst').AsString;
tempState:=adoquery1.fieldbyname('State').AsString;
tempcurrentPos:=adoquery1.fieldbyname('currentPos').AsString;
tempdt:=adoquery1.fieldbyname('InforDT').AsString;
tempnumber:=adoquery1.fieldbyname('Number').AsString; //sql语言 查询B表中是否存在这个SN号码的记录
tempsql:='select * from MaintainLog where sn=:p1';
sql.Add(tempsql);
Parameters[0].Value:=tempsn;
open;
if recordcount=1 then //如何存在就把A中几个字段和B中的几个字段写到C表中
begin
tempmaiwhys:=fieldbyname('MaiWhys').AsString;
temploc:=fieldbyname('MalLoc').AsString;
tempcause:=fieldbyname('Cause').AsString;
with adoquery3 do
begin
if active=true then Close;
SQL.Clear;
tempsql:='select * from QueryUseNoDelete';
SQL.add(tempsql);
Prepared:=true;
open;
Append;
fieldbyname('SN').Value:=tempsn;
fieldbyname('MobileType').Value:=tempMobileType;
fieldbyname('MalCode').Value:=tempMalCode;
fieldbyname('whereIs').Value:=tempwhereis;
fieldbyname('Analyst').Value:=tempAnalyst;
fieldbyname('State').Value:=tempState;
fieldbyname('currentPos').Value:=tempcurrentPos;
fieldbyname('dt').Value:=tempdt;
fieldbyname('Number').Value:=tempnumber;
fieldbyname('MaiWhys').Value:=tempmaiwhys;
fieldbyname('MalLoc').Value:=temploc;
fieldbyname('Cause').Value:=tempcause;
post;
end;
end;
if recordcount=0 then //如果没有匹配记录就写3个字段是“无分析记录”
begin
tempmaiwhys:='无分析记录';
temploc:='无分析记录';
tempcause:='无分析记录';
with adoquery3 do
begin
if active=true then Close;
SQL.Clear;
tempsql:='select * from QueryUseNoDelete';
SQL.add(tempsql);
Prepared:=true;
open;
Append;
fieldbyname('SN').Value:=tempsn;
fieldbyname('MobileType').Value:=tempMobileType;
fieldbyname('MalCode').Value:=tempMalCode;
fieldbyname('whereIs').Value:=tempwhereis;
fieldbyname('Analyst').Value:=tempAnalyst;
fieldbyname('State').Value:=tempState;
fieldbyname('currentPos').Value:=tempcurrentPos;
fieldbyname('dt').Value:=tempdt;
fieldbyname('Number').Value:=tempnumber;
fieldbyname('MaiWhys').Value:=tempmaiwhys;
fieldbyname('MalLoc').Value:=temploc;
fieldbyname('Cause').Value:=tempcause;
post;
end;
end;
adoquery1.next; //指针后移
end;
end;//===================================
问题提出:如果A表数据量比较多,500条以上就会出现程序假死的现象,请问该如何解决呢?
如果服务器端写SQL存储过程,该如何写,我是SQL初手。请大家帮忙啊!!!
//先把adoquery1和A表关联起来
with adoquery1 do
begin
if active=true then close;
SQL.Clear;
tempsql:='select * from tempinfordone';
sql.Add(tempsql);
prepared:=true;
open;
end; adoquery1.first; //A表指针从0开始 with adoquery2 do
begin
while not(adoquery1.Eof) do
begin
if active=true then close;
SQL.Clear;
//所有字段准备
tempsn:=adoquery1.fieldbyname('SN').AsString;
tempMobileType:=adoquery1.fieldbyname('MobileType').AsString;
tempMalCode:=adoquery1.fieldbyname('MalCode').AsString;
tempwhereis:=adoquery1.fieldbyname('whereIs').AsString;
tempAnalyst:=adoquery1.fieldbyname('Analyst').AsString;
tempState:=adoquery1.fieldbyname('State').AsString;
tempcurrentPos:=adoquery1.fieldbyname('currentPos').AsString;
tempdt:=adoquery1.fieldbyname('InforDT').AsString;
tempnumber:=adoquery1.fieldbyname('Number').AsString; //sql语言 查询B表中是否存在这个SN号码的记录
tempsql:='select * from MaintainLog where sn=:p1';
sql.Add(tempsql);
Parameters[0].Value:=tempsn;
open;
if recordcount=1 then //如何存在就把A中几个字段和B中的几个字段写到C表中
begin
tempmaiwhys:=fieldbyname('MaiWhys').AsString;
temploc:=fieldbyname('MalLoc').AsString;
tempcause:=fieldbyname('Cause').AsString;
with adoquery3 do
begin
if active=true then Close;
SQL.Clear;
tempsql:='select * from QueryUseNoDelete';
SQL.add(tempsql);
Prepared:=true;
open;
Append;
fieldbyname('SN').Value:=tempsn;
fieldbyname('MobileType').Value:=tempMobileType;
fieldbyname('MalCode').Value:=tempMalCode;
fieldbyname('whereIs').Value:=tempwhereis;
fieldbyname('Analyst').Value:=tempAnalyst;
fieldbyname('State').Value:=tempState;
fieldbyname('currentPos').Value:=tempcurrentPos;
fieldbyname('dt').Value:=tempdt;
fieldbyname('Number').Value:=tempnumber;
fieldbyname('MaiWhys').Value:=tempmaiwhys;
fieldbyname('MalLoc').Value:=temploc;
fieldbyname('Cause').Value:=tempcause;
post;
end;
end;
if recordcount=0 then //如果没有匹配记录就写3个字段是“无分析记录”
begin
tempmaiwhys:='无分析记录';
temploc:='无分析记录';
tempcause:='无分析记录';
with adoquery3 do
begin
if active=true then Close;
SQL.Clear;
tempsql:='select * from QueryUseNoDelete';
SQL.add(tempsql);
Prepared:=true;
open;
Append;
fieldbyname('SN').Value:=tempsn;
fieldbyname('MobileType').Value:=tempMobileType;
fieldbyname('MalCode').Value:=tempMalCode;
fieldbyname('whereIs').Value:=tempwhereis;
fieldbyname('Analyst').Value:=tempAnalyst;
fieldbyname('State').Value:=tempState;
fieldbyname('currentPos').Value:=tempcurrentPos;
fieldbyname('dt').Value:=tempdt;
fieldbyname('Number').Value:=tempnumber;
fieldbyname('MaiWhys').Value:=tempmaiwhys;
fieldbyname('MalLoc').Value:=temploc;
fieldbyname('Cause').Value:=tempcause;
post;
end;
end;
adoquery1.next; //指针后移
end;
end;//===================================
问题提出:如果A表数据量比较多,500条以上就会出现程序假死的现象,请问该如何解决呢?
如果服务器端写SQL存储过程,该如何写,我是SQL初手。请大家帮忙啊!!!
解决方案 »
- 用GridEH的日期下拉框进行输入时,如何让它只输入日期而不输入时间
- DELPHI大调查
- 百分求救:怎样用一台电脑控制两台打印机
- 用pop处理过邮箱的大虾请进---字符转换问题,up有分
- 为何我的label有问题?
- ADOQuery的过滤器的使用问题
- dephi中怎么分段分行呀,我用\n\r怎么都没有用?
- 请问如何实现TDBGrid控件中某一个cell底色改变或者高亮显示
- 如何设置打印大小,例:(将整个打印出的字体放大一号)?
- Delphi TDBGrid列添加按钮
- 麻烦高手帮我看看这个题目的意思:勇创C++ ———戏中学软件 ,用DELPHIE开发
- 是用存储过程还是直接在adoquery.sql.add中写代码?
tableA A1 x ax uui
A2 y f cc
A3 z f sstableB B1 x aa aab
B2 zz cc cda
B3 tt dd ddselect A.a1,a.a2,a.a3,b.b1,b.b2,b.b3 from tableA a,TableB b where b.b1=a.a1
结果
A1 a2 a3 b1 b2 b3
x y z x zz tt插入C
insert into c (a1,a2,a3,b2,b3) select A.a1,a.a2,a.a3,b.b2,b.b3 from tableA a,TableB b where b.b1=a.a1
2. 打开B表的语句也放在循环的外面,不用where语句(即打开完整的B表),记录的查找用Locate方法,这样也可以提高执行效率。但是这种情况下,用SQL语句是最有效率的,缺点是你无法控制显示处理进度,而且在大数据量的情况下,要注意TADOQuery的timeout要设置的高一点以保证SQL语句能够正常完成。
=============================================
这种打开表的方法,数据量大时肯定造成假死机的,
打开表的条件一定要有的
=============================================
这种打开表的方法,数据量大时肯定造成假死机的,
打开表的条件一定要有的===============================
是不是空结果查询条件也可以啊?好比where sn='000000000000'这个SN没有。
select 各字段 from A, B
where A.SN=B.SN
and A.SN not in
(SELECT SN FROM C)