2

内部結合に関する投稿はたくさんありますが、それが私の問題を完全に解決するかどうかわかりませんか?

結合したい 4 つのテーブルがあり、最初の 3 つが正しいと思われます。4 番目のテーブルを結合すると、結合によって行が乗算されます (テーブル AB * テーブル C)。

4 番目のテーブルには 37 行しかありませんが、1 番目のテーブル (tblawardedlearers) で数回繰り返される viewunitsonrun.strUnitCode に従って、各行を具体的に数回挿入する必要があります。

SELECT viewlearnersonrun.intRunID,
       intlearnerID,
       strFirstname, 
       strunitcode, 
       strGrade
  FROM tblawardedlearners
 INNER JOIN viewlearnersonrun
         ON viewlearnersonrun.intID = tblawardedlearners.intLearnerID
 INNER JOIN viewrun
         ON viewrun.intID = viewlearnersonrun.intRunID /*CORRECT TO THIS POINT */
 INNER JOIN viewunitsonrun
         ON viewunitsonrun.strUnitCode = tblawardedlearners.strUnitCode 
 WHERE viewlearnersonrun.intRunID = '200GE2'   /* display only one Course */
4

1 に答える 1

5

両方の結合が複数のレコードを返すため、デカルト積になります。最初JOINの後に結果を保持するには、他の参加者が一意のキーによって選択されていることを確認する必要があります。テーブルに選択用の一意のキーがない場合は、DISTINCTまたはを使用してサブクエリ(INLINE VIEW)を作成し、希望どおりGROUP BYに機能させることができます。

サンプル:

SELECT viewlearnersonrun.intRunID,
       intlearnerID,
       strFirstname,
       strunitcode,
       strGrade
  FROM tblawardedlearners 
 INNER JOIN viewlearnersonrun
         ON viewlearnersonrun.intID = tblawardedlearners.intLearnerID
 INNER JOIN viewrun
         ON viewrun.intID = viewlearnersonrun.intRunID 
 INNER JOIN (SELECT DISTINCT strUnitCode --, others columns...
               FROM viewunitsonrun
            ) v
         ON  v.strUnitCode = tblawardedlearners.strUnitCode
 WHERE viewlearnersonrun.intRunID = '200GE2'
于 2012-11-30T18:27:25.660 に答える