pap*_*zzo 2 t-sql aggregate-functions sql-server-2008 sql-update
执行select语句时没有错误或警告.
update语句引发错误:
关键字"group"附近的语法不正确.
select [sSVsys].[textUniqueWordCount], count(*) as [actCount]
from [docSVsys] as [sSVsys]with (nolock)
join [FTSindexWordOnce] with (nolock)
on [sSVsys].[sID] = [FTSindexWordOnce].[sID]
where [sSVsys].[sID] < 500000
group by [sSVsys].[sID], [sSVsys].[textUniqueWordCount]
having [sSVsys].[textUniqueWordCount] <> count(*)
update [sSVsys]
set [sSVsys].[textUniqueWordCount] = count(*)
from [docSVsys] as [sSVsys]with (nolock)
join [FTSindexWordOnce] with (nolock)
on [sSVsys].[sID] = [FTSindexWordOnce].[sID]
where [sSVsys].[sID] < 500000
group by [sSVsys].[sID], [sSVsys].[textUniqueWordCount]
having [sSVsys].[textUniqueWordCount] <> count(*)
Run Code Online (Sandbox Code Playgroud)
如果答案是加入派生表,那么我可以想出来.
我是否在现有更新时出现语法错误?
这个派生表工作正常
update [docSVsys]
set [docSVsys].[textUniqueWordCount] = [WordOnce].[actCount]
from [docSVsys]
join
( select [FTSindexWordOnce].[sID], count(*) as [actCount]
from [FTSindexWordOnce] with (nolock)
-- where [FTSindexWordOnce].[sID] < 1500000
group by [FTSindexWordOnce].[sID] ) as [WordOnce]
on [docSVsys].[sID] = [WordOnce].[sID]
and [docSVsys].[textUniqueWordCount] <> [WordOnce].[actCount]
Run Code Online (Sandbox Code Playgroud)
我将把这个问题或答案放在一个更好的方法上几天,然后再删除.这种方法是现有的SO答案.
您的原始更新语句具有GROUP BY和HAVING,这在UPDATE语句语法中是不允许的.这是语法图的链接: UPDATE(Transact-SQL).
您的第二个版本将GROUP BY和HAVING作为派生表的一部分,这是允许的.
所以,是的:你确实有语法错误.
顺便说一句,我同意@bluefeet:CTE代替派生表会使您的更新更容易阅读和理解.一件小事,但它可以在易于维护方面产生很大的不同.