请教数据库高手,在access2003里,用sql语句查询实现两表关联查询用count更新其中一表?

见图,两个表分别是T1,T2假定T1A列的取值范围只可能是T2的A列里的数据。且T2的A列的值是不重复的没有多余行。现在想实现的是把T1里A列与T2的A列对应的记录数汇总... 见图,两个表分别是T1,T2

假定T1A列的取值范围只可能是T2的A列里的数据。且T2的A列的值是不重复的没有多余行。
现在想实现的是把T1里A列与T2的A列对应的记录数汇总到C列。
拿图中数据举例,结果应该是
1 a 3
2 b 2
3 c 1
我自己sql不太熟悉,加上access里面似乎难度增加了不少,一直在报错必须有可更新的查询之类。
我把mdb文件上传了,大家可以下载来测试。
http://pan.baidu.com/s/1dDnJuZB
展开
 我来答
tjrmgs
推荐于2020-12-05 · TA获得超过5765个赞
知道大有可为答主
回答量:2161
采纳率:94%
帮助的人:1031万
展开全部

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列!

追问
谢谢,你回答得很认真,我测试下再说。
追答
再提供一个非连接的办法(使用DCount函数)。此法最方便,但是请注意这也是效率最低的方案!其理由我就不说了。
update T2 set C=Nz(DCount("[A]","T1","[A]='" & [A] & "'") ,0)
创作者zUzVB1Sl31
2014-12-11 · 编程类资料、英语学习资料
创作者zUzVB1Sl31
采纳数:1331 获赞数:5975

向TA提问 私信TA
展开全部
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连接查询就可以了
追问
你上面的代码报“From”子句错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
longrenyingdc8ecb1
2014-12-06 · TA获得超过1万个赞
知道大有可为答主
回答量:6032
采纳率:82%
帮助的人:2347万
展开全部
感觉上应该是用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;
追问
很遗憾没有,我也试过07版了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
areshowl
2014-12-06 · TA获得超过121个赞
知道小有建树答主
回答量:406
采纳率:0%
帮助的人:140万
展开全部
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就是你需要的数据
更多追问追答
追问
你的语句复制出来语法都是错误,你上面是手打的根本没测试过。希望严谨一点好吗?
追答
怎么可能,你是完全复制的吧?你手敲一遍试试,我倒是觉得你不太适合做技术的。。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
love灬闯天涯
2014-11-30 · 超过52用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:97万
展开全部
用程序分别链接sqlserver2008 和 ACCESS数据库
然后进行代码进行比较。
追问
没有程序,只是纯数据库里执行sql。还有,最好用sql语句来回答问题,不需要多余的建议。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式