2017-08-17 15 views
0

我試圖做一個查詢發現學生的所有細節採訪了不止一次如何使多桌子查詢少羅嗦訪問

我已經得到了成功的使用效果:

SELECT S.StudNo, S.StudLName, S.StudFName, S.StudMobile, S.City, S.DateEnrolled, S.ProgNo, S.AmountDue, S.Gender 
FROM STUDENT AS S INNER JOIN STUDENT_INTERVIEW AS SI ON S.StudNo = SI.StudID 
WHERE 
(SELECT COUNT(SI.StudID) 
FROM STUDENT_INTERVIEW) 
GROUP BY S.StudNo, S.StudLName, S.StudFName, S.StudMobile, S.City, S.DateEnrolled, S.ProgNo, S.AmountDue, S.Gender 
HAVING COUNT(SI.StudID) > 1; 

但它似乎過長。我試圖重寫它,使其少羅嗦,雖然我無法得到正確的結果。我一直在嘗試使用更多的子查詢來不必使用GROUP BY。當我這樣做時,我得到了所有學生的成績,而不是具體的2我之後

SELECT * 
FROM STUDENT 
WHERE StudNo IN 
(SELECT StudID 
FROM STUDENT_INTERVIEW 
WHERE 
(SELECT COUNT(StudID) 
FROM STUDENT_INTERVIEW 
HAVING COUNT(StudID) > 1;)) 
+0

您是否將第一個查詢錯誤地複製到了您的帖子中?它在語法上不正確。 WHERE子句不計算任何TRUE/FALSE。 – Parfait

回答

1

你的第一個查詢是一個好的開始。這是一種進步:

SELECT S.* 
FROM STUDENT AS S 
WHERE S.StudNo IN (SELECT SI.StudId 
        FROM STUDENT_INTERVIEW as SI 
        GROUP BY SI.StudId 
        HAVING COUNT(*) > 1 
       ); 

外部查詢既不需要的JOIN也不是GROUP BY。你基本上可以完成子查詢中的所有工作。

+0

非常感謝你,我正在處理我從課堂上得到的筆記,我認爲這不能解釋得太好。如果你很樂意解釋,我很好奇COUNT(*)如何在這種情況下工作?我擔心它會使用它,因爲它會計算一切,而不是縮小StudID。既然它是SELECT中唯一知道只計算StudID的東西? – Puff

+0

'COUNT(*)'統計匹配行的數量。它應該相當於計算主鍵。 –

+0

感謝您的解釋 – Puff