0

以下に、別のクエリの結果である変数を宣言する必要があることに注意してください。これを行わない場合は、値が必要な場所でいつでもこのクエリを繰り返す必要があります。

SQL Server は、キーワードDECLARE内に書き込まないことについて例外をスローしています。SELECT私は何ができるか、または何が欠けていますか?

SELECT A.StudentId,
(
        CASE WHEN (SELECT B.OverwrittenScore
            FROM dbo.OverwrittenScores AS B
            WHERE B.StudentId = A.StudentId AND B.AssignmentId = @assignmentId) IS NOT NULL
            THEN (SELECT B.OverwrittenScore
                FROM dbo.OverwrittenScores AS B
                WHERE B.StudentId = A.StudentId AND B.AssignmentId = @assignmentId)
            ELSE (-- ANOTHER QUERY, BY THE MOMENT: SELECT 0
            ) END
) AS FinalScore
FROM dbo.Students AS A

括弧内にいくつかのロジックを実装する必要があります。つまり、別の 2 つのクエリを実装する可能性があります。ここで BEGIN キーワードを使用できないかと考えていましたが、うまくいきませんでした

4

1 に答える 1

7

あなたはすべての狂気を必要としません。あなたがやろうとしていることには、多くの概念的な問題があります。

  1. クエリの途中で変数を宣言することはできません。

  2. スカラー変数は 1 つの値しか保持できません。

  3. SQL Server のスカラー変数は常に で始まります@。カーソル変数は単純な識別子にすることができますが、ここではカーソルは絶対に必要ありません。

  4. シンプルJOINはあなたが探していることをします。サブクエリ メソッドは機能しますが、ぎこちなく (SELECTステートメントにクエリを貼り付ける)、複数の列の値を取得することはできず、JOIN缶のようにクエリ全体で再利用することはできません。

  5. CASE列に対してステートメントを直接使用できます。最初に値を変数に入れようとする必要はありません。とにかく、それは機能しません (#2 を参照)。

  6. IsNullまたはCoalesce関数を使用して、より単純な構文でNULLa を a に変換できます。0

  7. Aやを使用する代わりに、テーブルを示唆するエイリアスを使用することをお勧めしますB。たとえば、SforStudentsOfor 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)。これをお勧めするのは、既にローカル テーブルを知っていて、外側のテーブルを知りたいので、結合をより速く理解するのに役立つからです。複数の条件を別々の行に入れることもお勧めします。これを習慣にすれば、将来、自分のクエリをより速く理解できるようになることを約束します。

于 2013-05-15T18:25:50.940 に答える