2013-03-28 34 views
1

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] 

我將離開這個了幾天的上一個更好的辦法有任何意見或答案,然後直接刪除。這種方法在現有的SO答案中。

+2

通常我會用一個子查詢與聚合或CTE。 – Taryn

回答

4

您的原始更新語句具有GROUP BY和HAVING,這在UPDATE語句語法中是不允許的。這裏是一個語法圖的鏈接:UPDATE (Transact-SQL)

你的第二個版本有GROUP BY和HAVING作爲派生表的一部分,允許的。

所以,是的:你確實有語法錯誤。

順便提一句,我同意@bluefeet:一個CTE代替派生表可以讓你的更新更容易閱讀和理解。一件小事,但它可以在易於維護方面產生重大影響。

+0

Bluefeet不建議在子查詢中使用CTE,而且我也沒有看到CTE如何在維護上產生重大影響。但仍然謝謝你的答案。 +1 – Paparazzi