1

フォーラム内の「子」投稿の数を追跡する列を更新する必要があります。親投稿と子投稿の両方が同じテーブルに保存されます。スキーマは次のとおりです。

ForumPosts {
   PostID: bigint,
   ParentFK: bigint, -- if child, this will point to the parent
   AnswerCount: int
   ...
}

投稿が子の場合、parentFKはForumPostsテーブルの別のレコードを指します。

私はこのようなことをしたい:

UPDATE ForumPosts 
SET AnswerCount = (
        SELECT COUNT(PostID) 
        FROM ForumPosts 
        WHERE ParentFK = ???
)

...しかし、SELECTは更新中のレコードを参照する必要があるため、機能しません。これを行う方法がわかりません。

4

2 に答える 2

3

サブクエリでエイリアスを使用します。これにより、フィールドがサブクエリに属する​​かメイン更新クエリに属する​​かを簡単に指定できます。

UPDATE ForumPosts 
SET AnswerCount = (
        SELECT COUNT(sub.PostID) 
        FROM ForumPosts sub
        WHERE sub.ParentFK = ForumPosts.PostID
)
于 2012-12-21T07:34:14.810 に答える
3

あなたはこれを行うことができます:

UPDATE f
SET f.AnswerCount = t.Counts
FROM ForumPosts f
INNER JOIN
(
   SELECT ParentFk, COUNT(PostID) counts
   FROM ForumPosts
   GROUP BY ParentFK
) t ON f.PostId = t.ParentFK;

ただし、これらのフォーラム投稿が階層として保存されている場合、この場合、次のような再帰CTEを使用できます。

DECLARE @parentID INT = 1;

WITH CTE
As
(
  SELECT PostId, ParentFK
  FROM ForumPosts
  WHERE parentFK = @parentId
  UNION ALL
  SELECT p.PostId, p.ParentFK
  FROM CTE c
  INNER JOIN ForumPosts p ON c.postId = p.parentFK
), WithCounts
AS
(
  SELECT ParentFk, Count(PostId) Counts
  FROM CTE
  GROUP BY ParentFK
)
UPDATE f
SET f.AnswerCount = t.Counts
FROM ForumPosts f
INNER JOIN WithCounts t ON f.PostId = t.ParentFK;

SQLフィドルデモ

于 2012-12-21T07:34:37.503 に答える