2017-05-08 73 views
1

這是我擁有的當前數據庫記錄,我只希望它顯示所有從未登記科學的學生的姓名。oracle SQL:在其所有記錄中不包含其他特定值的情況下選擇不同的值

Name  | Subject  | Year 
----------------------------------- 
Ian Lee  | Math  | 2008 
Ian Lee  | Science  | 2008 
Ian Lee  | Econs  | 2006 
Marie-Ann | Geography | 2006 
Marie-Ann | Literature | 2009 
Natalie S. | Geography | 2006 
Julienne | Math  | 2008 
Julienne | Science  | 2008 
Julienne | Literature | 2009 
Liam  | Literature | 2009 
Liam  | Econs  | 2006 

我還有一個學生記錄Emily Toh還沒有在任何課程中註冊。但是,正確的輸出應該是

Name 
------------ 
Marie-Ann 
Natalie S. 
Emily Toh 
Liam 

這是我用來調用

SELECT DISTINCT en.Name 
FROM ENROLLMENT en 
WHERE NOT EXISTS (
    SELECT st.Name 
    FROM STUDENT st 
    WHERE en.Name = st.Name 
    AND en.Subject = 'Science' 
); 

但它仍然給了我所有的學生姓名的顯示。

學生表和enrollemnt表是按照:

CREATE TABLE STUDENT(
    Name  VARCHAR2(50), 
    DOB  DATE, 
    Address VARCHAR(70), 
CONSTRAINT STUDENT_PKEY PRIMARY KEY (Name) 
); 

CREATE TABLE ENROLLMENT(
    Name  VARCHAR2(50), 
    Subject VARCHAR2(70), 
    Year  Number(4), 
CONSTRAINT ENROLLMENT_PK PRIMARY KEY (Name, Subject) 
CONSTRAINT ENROLLMENT_FKEY FOREIGN KEY (Name) REFERENCES TO STUDENT (Name) 
); 
+1

登記表設計的註冊和學生 – Avi

+0

交換表名稱。 –

+0

除了表格定義之外,請顯示來自兩者的樣本數據並標註每個數據。 –

回答

1

你做的方法是正確的,只是STUDENTS表開始,並查找使用NOT EXISTS科學招生。

SELECT st.Name 
FROM STUDENT st 
WHERE NOT EXISTS (
    SELECT st.Name 
    FROM enrollment en 
    WHERE en.Name = st.Name 
    AND en.Subject = 'Science' 
); 
+0

這一個爲我工作,因爲我想如何輸出,謝謝 – Monomoni

0

一種選擇是使用子查詢來識別所有的學生,你希望在您的結果集(即那些入選誰在科學的某個時刻),然後加入來濾除這些學生。

SELECT s.Name  -- , s.Id 
FROM STUDENT s 
LEFT JOIN 
(
    SELECT Name -- , Id 
    FROM ENROLLMENT 
    WHERE Subject = 'Science' 
) t 
    ON s.Name = t.Name -- AND s.Id = t.Id 
WHERE t.Name IS NULL 

這種方法將捕獲誰是就讀於沒有類學生誰入學,但在科學從未招收兩名學生。

理想情況下,還應該有一個Id列與兩個表中的每個學生相關聯。如果沒有這一點,如果兩個或兩個以上的學生分享同一個名字,加入一個有意義的方式可能會很困難。

0

如果您不需要擔心任何課程都沒有參加誰的學生,那麼你可以使用GROUP BY ... HAVING ...這樣的:

SELECT name 
FROM  enrollment 
GROUP BY name 
HAVING COUNT(CASE WHEN subject = 'Science' THEN 1 ELSE NULL END) = 0; 

如果你還沒有報名參加任何班級誰的學生,你想它們包括在輸出則:

SELECT s.name 
FROM  student s 
     LEFT OUTER JOIN 
     enrollment e 
     ON (s.name = e.name AND e.subject = 'Science') 
GROUP BY s.name 
HAVING COUNT(e.subject) = 0; 

name由於和subject是用於表則GROUP BYHAVING子句可以用0來替換複合主鍵檢查:

SELECT s.name 
FROM  student s 
     LEFT OUTER JOIN 
     enrollment e 
     ON (s.name = e.name AND e.subject = 'Science') 
WHERE e.subject IS NULL; 
+0

嗨,這個人已經工作,但沒有記錄在登記表中的學生Emily Toh無法顯示。 – Monomoni

+0

@Monomoni你有沒有嘗試第二個查詢,我說明了確切的案例? – MT0

相關問題