2

以下のクエリでは、括弧内の最初の 2 つのクエリに注意してください。2 つの繰り返しクエリを追加しました。これは良い方法ではないと確信しています。値が必要な場合はいつでもこのクエリを繰り返す必要があります。

SQL Server は、SELECT キーワード内に DECLARE を書き込まないように例外をスローしています。リファクタリングするために何ができるか、何が欠けていますか?

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
4

2 に答える 2

6

私の提案は、を使用して見ることですJOIN

SELECT A.StudentId,
    case 
        when B.OverwrittenScore is not null
        then B.OverwrittenScore
        else 0 
    end AS FinalScore
FROM dbo.Students AS A
LEFT JOIN dbo.OverwrittenScores B
    ON B.StudentId = A.StudentId 
    AND B.AssignmentId = @assignmentId

else で別の選択を使用する場合は、必要に応じてさらに結合を追加できます。

SELECT A.StudentId,
    case 
        when B.OverwrittenScore is not null
        then B.OverwrittenScore
        else c.whatever
    end AS FinalScore
FROM dbo.Students AS A
LEFT JOIN dbo.OverwrittenScores B
    ON B.StudentId = A.StudentId 
    AND B.AssignmentId = @assignmentId
LEFT JOIN anothertable c
   ON a.col = c.col

COALESCEまたは、null 値を置き換えるために使用することもできます。

SELECT A.StudentId,
    coalesce(B.OverwrittenScore, 0) as FinalScore 
FROM dbo.Students AS A
LEFT JOIN dbo.OverwrittenScores B
    ON B.StudentId = A.StudentId 
    AND B.AssignmentId = @assignmentId
于 2013-05-15T20:37:11.190 に答える
0

エラーに関するエラーDECLAREがどこから来ているのかわかりませんが、表示内容を変更できます

SELECT 
    A.StudentId,
    COALESCE(B.OverwrittenScore, 0) AS FinalScore
FROM dbo.Students AS A
LEFT JOIN dbo.OverwrittenScores AS B
    ON A.StudentId = B.StudentId AND B.AssignmentId = @assignmentId
于 2013-05-15T20:39:18.670 に答える