2

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(*)

答えが派生テーブルに結合することである場合は、それを理解できます。
既存の更新プログラムに構文エラーはありますか?

この派生テーブルは機能しました

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 回答にあります。

4

1 に答える 1

5

元の更新ステートメントに GROUP BY と HAVING が含まれていますが、これらは UPDATE ステートメントの構文では許可されていません。構文図へのリンクは次のとおりです: UPDATE (Transact-SQL)

2 番目のバージョンには、派生テーブルの一部として GROUP BY と HAVING が含まれていますが、これ許可されています。

そうですね、構文エラーがありました。

ちなみに、@bluefeet に同意します。派生テーブルの代わりに CTE を使用すると、更新が読みやすく理解しやすくなります。ちょっとしたことですが、メンテナンスのしやすさに大きな違いをもたらします。

于 2013-04-07T21:51:04.680 に答える