[英]Joining multiple SELECT queries and some simple calculations into one query
[英]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.