使用Join,Group By和Having进行更新

时间:2013-03-28 17:32:54

标签: sql-server-2008 tsql sql-update aggregate-functions

执行select语句时没有错误或警告。

更新语句抛出错误:
关键字“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(*)

如果答案是加入派生表,那么我可以解决这个问题 我是否在现有更新时出现语法错误?

此派生表工作

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]

我会把这个问题或答案放在一个更好的方法上几天,然后再删除。这种方法是现有的SO答案。

1 个答案:

答案 0 :(得分:5)

您的原始更新语句具有GROUP BY和HAVING,这在UPDATE语句语法中是不允许的。这是语法图的链接:UPDATE (Transact-SQL)

您的第二个版本将GROUP BY和HAVING作为派生表的一部分,允许的。

所以,是的:你确实有语法错误。

顺便提一下,我同意@bluefeet:代替派生表的CTE会使您的更新更容易阅读和理解。一件小事,但它可以在易于维护方面产生很大的不同。