編集: 元の回答に対するこのコメントが気に入っています: sackoverflow.com/questions/418898/… – zapl 7 分前. 私はあなたがそれを行うことができるとは知りませんでした。こう見るとなかなか有能ですね……。
私はこれを素早くやった。うまくいけば、アイデアが得られます...したがって、これらの変数やものは非SQLコードになります。可能であれば、ストアドプロシージャなどを使用することをお勧めします....またはすべてのセクションを完全に分離します(存在するかどうか、それに基づいてこのSQLを実行するか、このSQLを実行しないかを確認します)。
update ステートメントだけで....変数がテーブルに存在しない場合、何も更新されません。そして挿入ステートメントだけで...変数がテーブルに存在する場合、何も挿入されません。これらの 2 つのステートメントのほかに、回答に何かが存在するかどうかを実際に確認するために、if や何かが存在する必要はありません。
create table #answers (question_id int, player int, level int, other_field int)
insert into #answers values (1,1,1,1)
insert into #answers values (2,1,1,1)
declare @question_id int
declare @player int
declare @level int
declare @other_field int
set @question_id=1
set @player=1
set @level=1
set @other_field=1
-- if it exists already
update a
set other_field=@other_field
from #answers as a
where QUESTION_ID=@question_id and
PLAYER=@player and
other_field<>@other_field
set @question_id=4
set @player=4
set @level=1
set @other_field=1
-- if it doesn't exist
insert into #answers (question_id, player, level, other_field)
select x.QUESTION_ID, x.player, @level, @other_field
from #answers a
right outer join
(select @question_id as QUESTION_ID,
@player as player) as x
on x.QUESTION_ID=a.QUESTION_ID and
x.player=a.player
where a.player is null and a.question_id is null
またはこれが存在しない場合(より面倒ですが短い)
-- if it doesn't exist
insert into #answers (question_id, player, level, other_field)
select distinct @QUESTION_ID, @player, @level, @other_field
from #answers
where not exists (select 1 from #answers where
QUESTION_ID=@question_id and
PLAYER=@player )