7

フォーラム投稿(ForumPosts )に対するユーザーの投票(ForumVotes )を更新するクエリを作成しています。ユーザーは上または下に投票できます(投票は1または-1になります)。この質問はユーザーの投票の変更に固有であるため、投票レコードはすでにForumVotesテーブルに存在します。

ForumPostsテーブルには各投稿の合計スコアが格納されるため、このフィールドの同期を維持する必要があります。合計スコアを再計算するには、新しい投票を追加する前に最初に古い投票を差し引く必要があるため、ユーザーの投票レコードを更新する前に古い投票を取得する必要があります。

2つのクエリでこれを実行できることはわかっていますが、(SQL Server 2008では)UPDATEが更新を実行する前に列の値を返すことが可能かどうか疑問に思っていますか?

次に例を示します。

TABLE ForumPosts (
    postID bigint,
    score int,
    ... etc
)

-- existing vote is in this table:

TABLE ForumVotes (
    postFK bigint,
    userFK bigint,
    score int
)

ユーザーの投票を更新するための簡単なクエリ

UPDATE ForumVotes 
SET score = @newVote 
WHERE postFK = @postID
AND userFK = @userID

このクエリを変更して、更新前の古いスコアを返すことはできますか?

4

3 に答える 3

13

OUTPUT句を試してください。

declare @previous table(newscore int, Oldscore int, postFK int, userFK int)

UPDATE ForumVotes 
SET score = @newVote 
OUTPUT inserted.score,deleted.score, deleted.postFK, deleted.userFK into @previous
WHERE postFK = @postID
AND userFK = @userID

select * from @previous
于 2012-12-21T20:28:05.743 に答える
8

それがその時ならsingle row affected query (ie; update using key(s));

declare @oldVote varchar(50)

update ForumVotes 
set score = @newVote, @oldVote = score 
where postFK = @postId and userFK = @userId

--to receive the old value
select @oldVote 
于 2012-12-21T20:38:07.333 に答える
3

@HLGEMの回答を拡張して、中間テーブルは必要ないことを示します。変数を使用せずにデータを直接返す@previousことに依存できます。エイリアシングのみです。OUTPUT

UPDATE
    ForumVotes
SET
    Score = @newVote
OUTPUT
    INSERTED.Score AS NewScore,
    DELETED.Score  AS OldScore
WHERE
    PostFK = @postId AND
    USerFK = @userId

これを直接実行すると、1行のデータと2列のテーブルが返されます:NewScoreOldSCore

于 2016-04-27T04:26:33.137 に答える