【问题标题】:Update with a Join, Group By, and Having使用加入、分组依据和拥有进行更新
【发布时间】:2013-03-19 06:43:46
【问题描述】:

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

更新语句抛出错误:
关键字“组”附近的语法不正确。

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]

我会将其保留几天以获取任何 cmet 或更好方法的答案,然后删除。这种方法在现有的 SO 答案中。

【问题讨论】:

  • 通常我会使用带有聚合或 CTE 的子查询。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • Bluefeet 不推荐 CTE 而不是子查询,我看不出 CTE 如何对维护产生重大影响。但仍然感谢您的回答。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2021-07-09
  • 2012-02-28
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多