2

私の最初のクエリは、3つのテーブルから学生の詳細を引き出します。Student、StudentAddress、StudentNote。

私のクエリでは、ID、名前、住所、メモなどの学生の詳細をリストし、コースに登録した最も早い日付を見つける必要があります。

これを行うための集計クエリを作成しました。

SELECT STU_Name, MIN(ENR_StartDate)
FROM Student
INNER JOIN Enrolment
ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
GROUP BY STU_Name

これは、学生の詳細を引き出す私の主な質問です。

SELECT STU_Name, ADD_Addr_Line_1, ADD_Addr_Line_2, ADD_Addr_Line_3, ADD_Postcode, NTE_Note, ENR_StartDate
FROM Student
INNER JOIN StudentAddress
ON Student.STU_Student_ID = StudentAddress.ADD_Student_ID
INNER JOIN StudentNote
ON Student.STU_Student_ID = StudentNote.NTE_Student_ID
INNER JOIN Enrolment
ON Student.STU_Student_ID = Enrolment.ENR_Student_ID

これらのクエリをリンクして、結果セットが行の生徒ごとの最も早い開始日を教えてくれるようにします。

学生に望ましい出力

row0: student1id, student1name, student1address, student1note1, student1startdate

row1: student1id, student1name, student1address, student1note2, student1startdate

これにより、生徒は複数のメモを持つことができますが、開始開始は常に生徒に対して同じとして計算されます。

SQLフィドルでテストスキーマを構築しました。

http://sqlfiddle.com/#!2/cecea/4

助けてくれてありがとう。

4

2 に答える 2

1

生徒の1人については何もメモしていないことに注意してください。これは外部結合で修正されました。

別のケースでは、1人の生徒に対して2つのメモがあります。そのため、生徒の結果は2行になります。

これを解決するには、特定のメモ(最初、最後など)を選択する必要があります。これは、各学生の最初の登録レコードを見つけるために使用されるのと同じロジックを使用して行うことができます。

学生が同じ登録日に複数の行を持っている可能性がある場合を処理するように調整されました。このアプローチは、これらのタイプの関係のほとんどすべてを断ち切るために使用できます。通常、ウィンドウ関数の方が優れたアプローチですが、MySQLはそれらをサポートしていないことに注意してください。

SELECT STU_Name
     , ADD_Addr_Line_1
     , ADD_Addr_Line_2
     , ADD_Addr_Line_3
     , ADD_Postcode
     , NTE_Note
     , Enrolment.ENR_StartDate
     , Enrolment.ENR_ID
     , Student.STU_Student_ID
     , StudentAddress.ADD_ID
     , StudentNote.NTE_ID
  FROM Student
  JOIN StudentAddress
    ON Student.STU_Student_ID = StudentAddress.ADD_Student_ID
  LEFT JOIN StudentNote
    ON Student.STU_Student_ID = StudentNote.NTE_Student_ID
  JOIN Enrolment
    ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
  LEFT JOIN Enrolment AS e2
    ON Enrolment.ENR_Student_ID = e2.ENR_Student_ID
   AND (Enrolment.ENR_StartDate, Enrolment.ENR_ID) > (e2.ENR_StartDate, e2.ENR_ID)
 WHERE e2.ENR_StartDate IS NULL
;
于 2012-10-11T22:57:53.327 に答える
0

すべての列にテーブルエイリアスを追加して、それらがどこから来ているかを指定する必要があります。

SELECT STU_Name, ADD_Addr_Line_1, ADD_Addr_Line_2, ADD_Addr_Line_3, ADD_Postcode, NTE_Note, ENR_StartDate,
    G.EarliestStartDate
FROM Student
JOIN StudentAddress
        ON Student.STU_Student_ID = StudentAddress.ADD_Student_ID
JOIN StudentNote
        ON Student.STU_Student_ID = StudentNote.NTE_Student_ID
JOIN Enrolment
        ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
JOIN (
  SELECT Student.STU_Student_ID, MIN(ENR_StartDate) EarliestStartDate
  FROM Student
  INNER JOIN Enrolment
  ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
  GROUP BY STU_Name
) G on G.STU_Student_ID = Student.STU_Student_ID
于 2012-10-11T22:36:07.887 に答える