簡體   English   中英

將2個查詢合並為一個查詢,作為子查詢

[英]Joining 2 queries into one query, as subquery

我的第一個查詢從3個表中提取學生詳細信息。 學生,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

謝謝你的幫助。

請注意,您沒有為其中一名學生注明。 已通過外部聯接進行了更正。

在另一種情況下,一個學生有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
;

您應該向所有列添加表別名以指定它們的來源。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM