2012-07-23 21 views
1

這裏是我的表內以下記錄:SQL:顯示全名+過濾器按主題

EnrollStudents

EnrollID  StudentID SubjID 
1   1   1 
2   1   2 
3   1   3 
4   2   1 
5   3   2 

學生

StudentID  UserID  YearID  FirstName  LastName 
1    1   1   John   Doe 
2    3   1   Peter   Pan 
3    7   1   Isaac   Newton 

主題

SubjID  SubjCode  YearID 
1   English  1 
2   Math   1 
3   Science  1 

和輸出應該是...

StudentID  FullName 
2    Peter Pan 
3    Isaac Newton 

我能想出下面的SQL語句(感謝Ic.

SELECT s.StudentID, s.FirstName + ' ' s.LastName AS FullName 
FROM Students AS s 
LEFT OUTER JOIN EnrollStudents AS es ON s.StudentID = es.StudentID 
GROUP BY s.StudentID, s.FirstName, s.LastName 
HAVING COUNT(DISTINCT(es.SubjID)) < (SELECT COUNT(*) FROM Subjects) 

有沒有辦法,我可以按主題過濾查詢?比方說,我選擇英語,只有艾薩克牛頓可以報名。

+0

什麼DBMS +版本您使用的? – 2012-07-23 15:38:11

+0

@TimSchmelter SQL Server 2008 – abramlimpin 2012-07-23 15:43:41

回答

3

您可以使用一個簡單的查詢,以找到一個主題不是在校學生,如:

select StudentID, 
    FirstName + ' ' + LastName as FullName 
from Students 
where StudentID not in (
    select es.StudentID 
    from EnrollStudents es 
    inner join Subjects s on es.SubjID = s.SubjID 
    where s.SubjCode = 'English' 
) 

SQL Fiddle Example

你也可以把它寫成一個左連接,像這樣:

select s.StudentID, 
    s.FirstName + ' ' + s.LastName as FullName 
from Students s 
left outer join (
    select distinct es.StudentID 
    from EnrollStudents es 
    inner join Subjects s on es.SubjID = s.SubjID 
    where s.SubjCode = 'English' 
) ss on s.StudentID = ss.StudentID 
where ss.StudentID is null 
+0

謝謝!奇蹟般有效! – abramlimpin 2012-07-23 16:19:42

1

我認爲你的查詢是不必要的複雜。例如,您不需要左外部聯接。此外,您還可以與having子句中的子查詢分配:

SELECT s.StudentID, s.FirstName + ' ' s.LastName AS FullName 
FROM Students AS s JOIN 
    EnrollStudents AS es 
    ON s.StudentID = es.StudentID 
GROUP BY s.StudentID, s.FirstName, s.LastName 
HAVING COUNT(DISTINCT(es.SubjID)) < COUNT(es.SubjID) 

要獲得唯一的英文:

SELECT s.StudentID, s.FirstName + ' ' s.LastName AS FullName 
FROM EnrollStudents AS es join 
    Students AS s 
    ON s.StudentID = es.StudentID join 
    Subjects su 
    on es.subjid = su.subjid 
where su.subjcode in ('English') 
GROUP BY s.StudentID, s.FirstName, s.LastName 
HAVING COUNT(DISTINCT(es.SubjID)) < COUNT(es.SubjID) 

當局限於單一的主題,我認爲「具有」條款是無關緊要的。你能描述一下你想要查詢的內容嗎?

+0

我想顯示尚未註冊主題(EnrollStudents)的學生的StudentID和FullName。我應該能夠把WHERE子句,因爲我想篩選每個主題的顯示。 – abramlimpin 2012-07-23 15:50:49

0

這在MySQL中適用於我。只好來連接不同的方式,但就像一個魅力

SELECT Students.StudentID, CONCAT(Students.FirstName, ' ', Students.LastName) AS FullName 
FROM Students, Enrollstudents, Subjects 
WHERE Subjects.SubjID = 2 <--- HERE IS THE BIT YOU CHANGE TO FILTER 
AND EnrollStudents.SubjID = Subjects.SubjID 
AND Students.StudentID = Enrollstudents.StudentID 

並與concat方法你使用:

SELECT Students.StudentID, Students.FirstName + ' ' Students.LastName AS FullName 
FROM Students, Enrollstudents, Subjects 
WHERE Subjects.SubjID = 2 
AND EnrollStudents.SubjID = Subjects.SubjID 
AND Students.StudentID = Enrollstudents.StudentID 

注:你可以做你想要的WHERE子句什麼。爲了讓每個人未在某一主題入學後,您更改第四行:

AND EnrollStudents.SubjID <> Subjects.SubjID 

AND NOT EnrollStudents.SubjID = Subjects.SubjID 

(我認爲)