2012-10-11 64 views
2

我的第一個查詢從3個表中抽出學生的詳細信息。學生,學生地址和學生筆記。將2個查詢加入到一個查詢中,作爲子查詢

我的查詢必須列出學生的詳細信息,包括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

感謝您的幫助。

回答

1

請注意,您沒有注意到其中一位學生。這是通過外連接糾正的。

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

你會得到一個笛卡兒的產品,在同一天開始的4門課程中學生(相當普遍!) – RichardTheKiwi

+0

這一直是你需要牢記的一個問題。這個解決方案只是爲了展示這個概念。如果您不小心,任何這些表格都會產生奇怪的結果。有一種簡單的方法可以在註冊表中打破關係,只需對ON子句進行簡單的更改即可。 –

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 
+0

謝謝,正是我想要做的。 –

+0

這意味着我有+1標記?大聲笑我會排序它。真的很感激快速的迴應。 –