超难问题,如何用一条SQL语句,重新统计文章的评论数

时间:2021-07-23 21:54:18
有一个文章表 Article
文章表字段如下: 

ArticleId 文章ID
Title  文章标题
Body  文章内容
Addtime 文章添加时间
ReviewNum 文章评论数量


有一个评论表 Review
评论表字段如下:

ReviewId  评论Id
Title 评论标题
Body 评论内容
AddTime 评论发表时间
ArticleId 该条评论所属文章ID



由于文章表中的评论数量不正确,我想重新更新一下文章表中的评论数量,怎么做?

下面是在SQL 2000 中的写法可行,但是在Access中如何写呢?
UPDATE Article SET ReviewNum =(SELECT COUNT(*) FROM Review WHERE ArticleId=Article.ArticleId)










13 个解决方案

#1


--Access中不支持这种带子查询的update语句,需要用域函数,或借助中间表

--域函数如下:

UPDATE Article as T SET ReviewNum =DCOUNT("*","Review","ArticleId='" & T.ArticleId & "'") 


--如果ArticleId是数值型,需要去掉两侧的单引号,如:

UPDATE Article as T SET ReviewNum =DCOUNT("*","Review","ArticleId=" & T.ArticleId) 

#2


ccess使用的是Jet-SQL,而SQL Server使用的是T-SQL,两者用法上相差很大。

Access的Update语句中,对于含有聚合子查询的支持远比不上SQL Server,所以要使用域函数或借助临时表。



JET SQL 帮助(jet4 access2000)下载地址

http://www.access911.net/index.asp?board=8&recordid=75FAB71E&tt=



#3


如果加上判断是否为NULL ,如何NULL 则更新评论为 0  

下面是SQL2000 写法。改成Accesss 怎么写?
UPDATE Article SET Review=ISNULL((UPDATE Article SET ReviewNum =(SELECT COUNT(*) FROM Review WHERE ArticleId=Article.ArticleId)),0)




#4


nz(表达式,0)

#5


UPDATE Article as T SET ReviewNum =DCOUNT("*","Review","ArticleId=" & T.ArticleId) 

按照上面的写法,
可老是提示“不能在更新查询中更新全部记录”,说是类型转换失败  。请问是怎么回事啊

#6


articleId 是数字型啊

#7


--如果ArticleId为字符型,需要加单引号,如:

UPDATE Article as T SET ReviewNum =DCOUNT("*","Review","ArticleId='" & T.ArticleId & "'")  

#8


我最终是这样写的


UPDATE Article AS T SET ReviewNum = NZ(DCOUNT("*","Review","ArticleId="+T.ArticleId+""),0)


可老是提示“不能在更新查询中更新全部记录”,说是类型转换失败  。请问是怎么回事啊 


articleId 是数字型的啊,不用加'引号  就算我加了仍然有错

#9



提示错误如下:

microsoft access 不能在更新查询中更新全部记录
microsoft access 不能更新11个字段是因为类型转换失
败,不能更新0个记录是因为键值冲突,不能更新0个记录
是因为锁定冲突,不能更新0个记录是因为有效性规则冲突。
是否继续执行这个类型的操作查询?
如要忽略错误并且执行查询,请单击 “是”
关于冲突原因的解释,请选择“帮助”按钮。




#10


你的情况分二步:

1. 将统计数据放入一个临时表
select ArticleId,count(ArticleId) as n into tmp 
from Review 
group by ArticleId

2.更新表Article 
update Article a,tmp b
set a.ReviewNum=b.n
where a.ArticleId=b.ArticleId


#11





--先查询试试

select NZ(DCOUNT("*","Review","ArticleId="+T.ArticleId+""),0) 
from Article AS T
 

#12



UPDATE Article SET ReviewNum =dCOUNT('*','Review','ArticleId=' & Article.ArticleId) 
假设ID为数字型,上述SQL语句只能在ACCESS中使用

#13


根据错误提示信息,可以确定是数据类型导致。

如果你的'ArticleId'是数字型,去掉两侧的单引号。如果是字符型,需要有单引号。

#1


--Access中不支持这种带子查询的update语句,需要用域函数,或借助中间表

--域函数如下:

UPDATE Article as T SET ReviewNum =DCOUNT("*","Review","ArticleId='" & T.ArticleId & "'") 


--如果ArticleId是数值型,需要去掉两侧的单引号,如:

UPDATE Article as T SET ReviewNum =DCOUNT("*","Review","ArticleId=" & T.ArticleId) 

#2


ccess使用的是Jet-SQL,而SQL Server使用的是T-SQL,两者用法上相差很大。

Access的Update语句中,对于含有聚合子查询的支持远比不上SQL Server,所以要使用域函数或借助临时表。



JET SQL 帮助(jet4 access2000)下载地址

http://www.access911.net/index.asp?board=8&recordid=75FAB71E&tt=



#3


如果加上判断是否为NULL ,如何NULL 则更新评论为 0  

下面是SQL2000 写法。改成Accesss 怎么写?
UPDATE Article SET Review=ISNULL((UPDATE Article SET ReviewNum =(SELECT COUNT(*) FROM Review WHERE ArticleId=Article.ArticleId)),0)




#4


nz(表达式,0)

#5


UPDATE Article as T SET ReviewNum =DCOUNT("*","Review","ArticleId=" & T.ArticleId) 

按照上面的写法,
可老是提示“不能在更新查询中更新全部记录”,说是类型转换失败  。请问是怎么回事啊

#6


articleId 是数字型啊

#7


--如果ArticleId为字符型,需要加单引号,如:

UPDATE Article as T SET ReviewNum =DCOUNT("*","Review","ArticleId='" & T.ArticleId & "'")  

#8


我最终是这样写的


UPDATE Article AS T SET ReviewNum = NZ(DCOUNT("*","Review","ArticleId="+T.ArticleId+""),0)


可老是提示“不能在更新查询中更新全部记录”,说是类型转换失败  。请问是怎么回事啊 


articleId 是数字型的啊,不用加'引号  就算我加了仍然有错

#9



提示错误如下:

microsoft access 不能在更新查询中更新全部记录
microsoft access 不能更新11个字段是因为类型转换失
败,不能更新0个记录是因为键值冲突,不能更新0个记录
是因为锁定冲突,不能更新0个记录是因为有效性规则冲突。
是否继续执行这个类型的操作查询?
如要忽略错误并且执行查询,请单击 “是”
关于冲突原因的解释,请选择“帮助”按钮。




#10


你的情况分二步:

1. 将统计数据放入一个临时表
select ArticleId,count(ArticleId) as n into tmp 
from Review 
group by ArticleId

2.更新表Article 
update Article a,tmp b
set a.ReviewNum=b.n
where a.ArticleId=b.ArticleId


#11





--先查询试试

select NZ(DCOUNT("*","Review","ArticleId="+T.ArticleId+""),0) 
from Article AS T
 

#12



UPDATE Article SET ReviewNum =dCOUNT('*','Review','ArticleId=' & Article.ArticleId) 
假设ID为数字型,上述SQL语句只能在ACCESS中使用

#13


根据错误提示信息,可以确定是数据类型导致。

如果你的'ArticleId'是数字型,去掉两侧的单引号。如果是字符型,需要有单引号。