あなたはすべての狂気を必要としません。あなたがやろうとしていることには、多くの概念的な問題があります。
クエリの途中で変数を宣言することはできません。
スカラー変数は 1 つの値しか保持できません。
SQL Server のスカラー変数は常に で始まります@
。カーソル変数は単純な識別子にすることができますが、ここではカーソルは絶対に必要ありません。
シンプルJOIN
はあなたが探していることをします。サブクエリ メソッドは機能しますが、ぎこちなく (SELECT
ステートメントにクエリを貼り付ける)、複数の列の値を取得することはできず、JOIN
缶のようにクエリ全体で再利用することはできません。
CASE
列に対してステートメントを直接使用できます。最初に値を変数に入れようとする必要はありません。とにかく、それは機能しません (#2 を参照)。
IsNull
またはCoalesce
関数を使用して、より単純な構文でNULL
a を a に変換できます。0
A
やを使用する代わりに、テーブルを示唆するエイリアスを使用することをお勧めしますB
。たとえば、S
forStudents
とO
for OverwrittenScores
。
これらすべての点を考慮に入れると、代わりに次のようなことができます。
SELECT
S.StudentId,
OverwrittenScore = Coalesce(O.OverwrittenScore, 0)
FROM
dbo.Students S
LEFT JOIN dbo.OverwrittenScores O
ON S.StudentId = O.StudentID
AND O.AssignmentId = @assignmentId
LEFT JOIN dbo.SomeOtherTable T -- add another join here if you like
ON S.StudentID = T.StudentID
AND O.OverwrittenScore IS NULL
アップデート
上記にもう1つ追加しましたLEFT JOIN
。という条件でどのように結合するかがわかりますO.OverwrittenScore IS NULL
か? これはおそらくあなたが望むことをするように思えます。
繰り返しますが、詳細を提供していただければ、より多くの回答をお見せします。
また、投稿の編集が非常に複雑です。そのようにクエリを作成する場合は、次のようにすることをお勧めします。
SELECT
S.StudentId,
FinalScore =
Coalesce(
(SELECT O.OverwrittenScore
FROM dbo.OverwrittenScores O
WHERE
S.StudentId = O.StudentId
AND O.AssignmentId = @assignmentId
),
(SELECT SomethingElse FROM SomewhereElse),
0
)
FROM dbo.Students S
また、相関または結合を作成するときに、他のテーブルまたは外部テーブルを結合の最初に配置することもお勧めします ( のS.StudentId = O.StudentId
代わりにO.StudentId = S.StudentId
)。これをお勧めするのは、既にローカル テーブルを知っていて、外側のテーブルを知りたいので、結合をより速く理解するのに役立つからです。複数の条件を別々の行に入れることもお勧めします。これを習慣にすれば、将来、自分のクエリをより速く理解できるようになることを約束します。