ACCESS数据库是可以用两个表关联的结果来更新其中一列表的。但是由于ACCESS Jet引擎功能较弱,它只能用数据表中实际存在的列的值来更新其中一张表,对于计算得来的列的列值是无法用于更新的,哪怕是事前将有查询关语句保存为一个固定名称的查询也不成。
例如
update T2 a,(select A,count(A) as cnt from T1 group by A) b
set a.C=b.cnt where b.A=a.A;
或者将其中的子查询“select A,count(A) as cnt from T1 group by A” 保存为查询“Q1”
上述语句改写如下
update T2 a,Q1 b set a.C=b.cnt where b.A=a.A;
上述两句的语法都没问题,但是无法执行(报错必须有可更新的查询)
这么办?因为cnt列是计算得来的,Jet无法利用该列更新T2的字段C,那我们就利用一张中间表T3来绕过这个限制。
先运行生成表查询,将上述子查询结果保存为表“T3”
select A,count(A) as cnt into T3 from T1 group by A;
再运行下列更新即可实现楼主的需求
update T2 a,T3 b set a.C=b.cnt where b.A=a.A;
如果以后要经常运行该操作,请先运行一下面两个动作查询来更新之前T3表里已有的数据,以免旧有数据影响更新查询的正确性。
1.清空旧数据
delete from T3;
2.存入新的子查询结果
insert into T3 SELECT A,count(a) as cnt from T1 group by A;
3.执行更新查询,更新T2表的C列
update T2 a,T3 b set a.C=b.cnt where b.A=a.A;
确实有些麻烦,但是目前暂时还未能找到不借助中间T3表的SQL语句解决方案。
*******
其实更新T2表的C列有些多余,因为我们可以非常方便地用选择查询得到你要的列表
select a.id,a.A,Nz(b.cnt,0) as C from T2 a left join
(select A,count(A) as cnt from T1 group by a) b
on b.A=a.A;
一句选择查询就搞定了,实在是没必要去花大把的精力来维护这个C列!
Select [T2].A,[T2].C from [T2] Left join Select * from (Select [T1].A, count(*) as 数量 from [T1] group by [T1].A) as [查询1] on [T2].A=[查询1].A;
如果你觉得写得累,可以用很简单的办法解决,直接把T1按A列统计一下,然后保存为查询1,再把查询1跟T2连接查询就可以了
感觉上应该是用merge语句,可是我不会用access,不知道他里面有没有merge语句,而且merge没有insert我也不知道行不行,你试试吧。不行就算了。
merge into T2
using (select A,count(*) B from T1 group by A) TT
on T2.A=TT.A
WHEN MATCHED THEN
UPDATE SET
T2.C=TT.B;
select id,t2a,count(*) as c from (
select t1.a as t1a,t2.id,t2.a as t2a from t1,t2 where t1.a=t2.a
)
c就是你需要的数据
用程序分别链接sqlserver2008 和 ACCESS数据库
然后进行代码进行比较。