2

このクエリはいくつかのAssignmentId's

SELECT AS2.AssignmentId
FROM dbo.AssignmentSummary AS AS2
WHERE AS2.SixweekPosition = 1 AND AS2.TeacherId = 'mggarcia'

このクエリは、変数を介して 1 つの割り当てのみの値を取得します@assignmentId

SELECT S.StudentId, 
        CASE WHEN OW.OverwrittenScore IS NOT NULL
            THEN OW.OverwrittenScore
            ELSE dbo.GetFinalScore(S.StudentId, @assignmentId)
        END AS FinalScore
FROM dbo.Students AS S
LEFT JOIN dbo.OverwrittenScores AS OW
    ON S.StudentId = OW.StudentID
    AND OW.AssignmentId = @assignmentId
WHERE S.ClassId IN (
    SELECT C.ClassId
    FROM Classes AS C
    WHERE C.TeacherId = @teacherId
)

私が指摘したように、最後のクエリでは、変数を介して値を割り当て、テーブルを返すときに機能します。AssignmentId'sここで、最初のクエリからいくつかのテーブルを取得したいと考えています。

私が必要なものは何?結合テーブル? 私は今何をすべきか分かりません。

4

3 に答える 3

2
AND OW.AssignmentId IN
(
    SELECT AS2.AssignmentId
    FROM   dbo.AssignmentSummary AS AS2
    WHERE  AS2.SixweekPosition = 1 AND AS2.TeacherId = 'mggarcia'
)

テーブルが互いにどのように関連しているか教えていただければ、提案は最適化できます。

于 2013-05-17T01:35:00.357 に答える
1

相関サブクエリでAPPLY演算子を使用します。また、CASE 式を関数 ISNULL に置き換えることもできます。

SELECT S.StudentId, 
       ISNULL(o.OverwrittenScore, dbo.GetFinalScore(S.StudentId, o.AssignmentId)) AS FinalScore
FROM dbo.Students AS S
  OUTER APPLY (
               SELECT OW.OverwrittenScore, AS2.AssignmentId
               FROM dbo.OverwrittenScores AS OW JOIN dbo.AssignmentSummary AS AS2
                 ON OW.AssignmentId = AS2.AssignmentId
               WHERE AS2.SixweekPosition = 1 AND AS2.TeacherId = 'mggarcia'
                 AND S.StudentId = OW.StudentID
               ) o
WHERE S.ClassId IN (
                    SELECT C.ClassId
                    FROM Classes AS C
                    WHERE C.TeacherId = @teacherId
                    )
于 2013-05-17T07:42:52.993 に答える
1

次を使用してそれらを組み合わせることができますin

SELECT S.StudentId, 
        CASE WHEN OW.OverwrittenScore IS NOT NULL
            THEN OW.OverwrittenScore
            ELSE dbo.GetFinalScore(S.StudentId, @assignmentId)
        END AS FinalScore
FROM dbo.Students AS S
LEFT JOIN dbo.OverwrittenScores AS OW
    ON S.StudentId = OW.StudentID
    AND OW.AssignmentId in (SELECT AS2.AssignmentId
                            FROM dbo.AssignmentSummary AS AS2
                            WHERE AS2.SixweekPosition = 1 AND AS2.TeacherId = 'mggarcia'
                           )
WHERE S.ClassId IN (
    SELECT C.ClassId
    FROM Classes AS C
    WHERE C.TeacherId = @teacherId
)

このクエリを単純化する方法があるかもしれません。これは、最初のクエリを 2 番目のクエリに置き換える直接変換を行います。

于 2013-05-17T01:36:55.690 に答える