假设相同结构的表有6个,表名分别是t1,t2,……t6
新建表t7,作为目标表。表7应有dateofmonth User_ID Detail1……Detail6。
我想的方法是这样:对这6个表依次进行遍历,在表7遇到有相同dateofmonth User_ID的记录则update,否则insert。
需要函数如下:
procedure 1(var str : string);
begin
query1.close;
query1.sql..clear;
query1.sql.add(str);
for I := 1 to query1.recordcount do
begin
取出v1:= dateofmonth v2:=User_ID v3:=Detail
判断 select count(*) as a from t7 where dateofmonth =v1 and User_ID =v2
if a=0
insert t7 values (v1,v2,…,v3…)
else a =1
update t7 set Detailn = v3 where dateofmonth =v1 and User_ID =v2
end;
end;
新建表t7,作为目标表。表7应有dateofmonth User_ID Detail1……Detail6。
我想的方法是这样:对这6个表依次进行遍历,在表7遇到有相同dateofmonth User_ID的记录则update,否则insert。
需要函数如下:
procedure 1(var str : string);
begin
query1.close;
query1.sql..clear;
query1.sql.add(str);
for I := 1 to query1.recordcount do
begin
取出v1:= dateofmonth v2:=User_ID v3:=Detail
判断 select count(*) as a from t7 where dateofmonth =v1 and User_ID =v2
if a=0
insert t7 values (v1,v2,…,v3…)
else a =1
update t7 set Detailn = v3 where dateofmonth =v1 and User_ID =v2
end;
end;
然后调用
1('select * from t1')
1('select * from t2')
1('select * from t3')
1('select * from t4')
1('select * from t5')
1('select * from t6')
update t7 set Detailn = v3 where dateofmonth =v1 and User_ID =v2
//这里少了
query1.next;
end;
能否用左右联接实现呢?采用你所说的方法可以实现,可是对于大数据量好慢哟,不过不失为一种解决方案,先谢过你呢,分到最后再给,看看还有没有更好的方法。
对于左右联接,我试了一下,按dateofmonth,userid相等原则合并时,相当简单和快捷,不需要
判断插入位置和更新位置。但存在的问题是,当其中某一表中的dateofmonth,user_id在其它表中不存在时,这些记录会在合成中漏掉,我现在只需想个办法将这些少量的遗漏数据补上去就成了而且应该不用考虑定位,因为这时只用考虑Insert便够了。各种方法待我一一试来。
试试:select dateofmonth,user_id,detail,t2.detail
form t1 full outer join t2
on (dateofmonth=t2.dataofmonth and user_id=t2.user_id)
对,表的数目可以固定下来,每个表的 dateofmonth+userid 两个字段组合不会重复,但单一字段会有重复的。
可是在Access97中好像不支持full outer join??
你是指在MsSql吧!
那些相同结构的表可不可以加一个TableIndex字段(值为常数,例如表n为n);
然后 (select * from t1) union (select * from t2) ...得到一View,
然后 group by dateofmonth,user_id
order by TableIndex