0

外部結合を機能させるのに少し問題があります。過去に MS Access で期待どおりに機能させましたが、SQL Server で同様のことが起こって問題が発生しています。

次のような各生徒に適用されるスコアの表があります。

+-------------+------------+-------+
| StudentID   | StandardID | Score |
+-------------+------------+-------+
| 100         | 1011       | 1     |
| 100         | 1012       | 2     |
| 101         | 1011       | 3     |

各生徒には多くのスコアがあり、各スコアは 1 つの標準に関連付けられています。さらに、各学生は、別のテーブル グループに含まれる 1 つ以上のグループに属する場合があります。

+-------------+------------+
| StudentID   | GroupID    |
+-------------+------------+
| 100         | 83         |
| 101         | 83         |

私がやりたいことは、スコア情報を抽出し、グループごとにフィルター処理することです。このデータセットは、StudentID によって他の場所の正しいレコードと照合されます。ただし、特定の生徒について取得したデータセットごとに、正確に同じ数の行 (標準ごとに 1 つ) が必要です。理想的にはこれ(上記のデータの場合):

StudentID = 100
+------------+-------------+------------+-------+
| StandardID | StudentID   | GroupID    | Score |
+------------+-------------+------------+-------+
| 1011       | 100         | 83         | 1     |
| 1012       | 100         | 83         | 2     |

StudentID = 101
+------------+-------------+------------+-------+
| StandardID | StudentID   | GroupID    | Score |
+------------+-------------+------------+-------+
| 1011       | 101         | 83         | 3     |
| 1012       | 101         | 83         | NULL  | <--Can't get this to happen

必要なリストを取得できますが、そこには NULL 行はありません。さらに別の例として、ある生徒のスコアが 4 つあるのに、別の生徒のスコアが 1 つしかない場合でも、クエリによって 4 つの行が返される必要があり、スコアがない場合は NULL が含まれます。

これは私がこれまでに試したことです(もう少し冗長ですが、本質的に):

SELECT Standards.StandardID, scores.StudentID, scores.TestDate, scores.Score, 
    scores.Assessment
FROM scores RIGHT OUTER JOIN
    (SELECT scores_1.StandardID
     FROM scores AS scores_1 INNER JOIN studentGroups 
         ON scores_1.StudentID = studentGroups.StudentID
     WHERE (studentGroups.GroupID = 83)
     GROUP BY scores_1.StandardID) AS Standards 
ON scores.StandardID = Standards.StandardID
WHERE scores.StudentID = 100

どんな助けでも素晴らしいでしょう!

4

2 に答える 2

0

データベース構造を教えてください。すべての学生に同じ数の行を返すには、異なる StandardID を持つ一時テーブルを作成し、外部結合を使用してすべての学生に同じ数の行を取得する必要があるためです。

さらに適切な ans のテーブル構造を提供します。

于 2013-04-06T06:25:01.017 に答える
0

上記の 2 つのテーブルとしてscoresとを使用します。groupsあなたはもっと多くの用語を使っていたので、私は少し混乱しました (おそらく混乱しています)。ただし、これは機能するはずです。

select AllStandards.StandardID,
       groups.StudentID,
       groups.GroupID,
       Scores.Score
from   (select distinct StandardID from scores) AllStandards
       left join (
         scores 
         join groups 
           on groups.StudentID = scores.StudentID
         )
         on AllStandards.StandardID = scores.StandardID
 where groups.StudentID=100

最初に利用可能なすべてのリストを作成し、StandardID次にすべての学生とスコアに左結合を実行してリストを取得します。

于 2013-04-06T08:40:17.453 に答える