2011-04-17 175 views
0

有人問我這個有趣的問題:獲得不同的結果

Table: Student 
ID  NAME 
1  JOHN 
2  MARY 
3  ROBERT 
4  DENNIS 

Table: Grade 
ID   GRADE 
1    A 
1    A 
1    F 
2    B 
3    A 

怎麼寫SQL查詢返回誰從未收到過級「F」或誰從來沒有采取一門課程所有學生的唯一名字(意思,他們的ID不在等級表中)?

技巧部分是,你不允許使用OUTER JOIN,UNION或DISTINCT。另外,爲什麼這是一個大問題?

預期結果是瑪麗,羅伯特,丹尼斯(3排)。

+1

像家庭作業的氣味 – tobyodavies 2011-04-17 01:05:00

+0

成績表中的id列是Student表的外鍵? – JoshRoss 2011-04-17 01:06:18

回答

2
SELECT name FROM student 
WHERE (SELECT COUNT(*) FROM grade WHERE grade = 'F' 
     AND id = student.id) = 0 

至少這是最簡單的回答至今...

+1

... grade ='F'and student.id = grade.id – Asterisk 2011-04-17 01:33:08

3
SELECT name FROM Student 
WHERE 
NOT EXISTS (SELECT * FROM Grade WHERE Grade.id = Student.id AND grade = 'F') 
OR 
NOT EXISTS (SELECT * FROM Grade WHERE Grade.id = Student.id); 

您可以使用GROUP BY來僞造一個獨特的。

0

嗯,我的功課感刺痛......不是我的問題,從來沒有涉及到的功課雖然...

您可以使用GROUP BY和聚合函數,以假明顯。

2

像這樣的東西可以工作,如果你被允許使用子查詢。

SELECT `NAME` 
FROM Student 
WHERE 'F' NOT IN 
    (SELECT GRADE FROM Grade WHERE ID = Student.ID) 
0

要排除大家誰也都採取了課程,並獲得的「F」一個檔次。像這樣的東西可能會奏效:

SELECT NAME 
FROM Student 
WHERE 0 = (SELECT COUNT(*) 
      FROM Student 
       LEFT JOIN Grade 
       USING (ID) 
      WHERE GRADE='F') 
GROUP BY NAME 
+0

LEFT JOIN是不允許的OUTER JOIN形式 – 2011-04-17 01:25:52

0

一個原因,他們可能不希望您使用UNION,JOIN或DISTINCT是,如果你試圖迫使「優化」解決其中的一些查詢的速度可能很慢。
我不太熟悉查詢優化技術,但通常如果您使用其中一些聚合器和JOIN,則可能會減慢查詢速度,而不是讓查詢優化運行並根據您的表結構和內容來組織SQL 。

+0

我認爲這與表演沒有任何關係。他們只是想確保你知道一些運營商的替代品。 – 2011-04-17 01:23:58

+0

這給了'約翰'以及 – Asterisk 2011-04-17 01:26:45

+0

哇,這是錯誤的。我已經刪除了SQL。希望有關爲什麼不使用它的信息可能仍然有效... – chustar 2011-04-17 01:35:48

0
SELECT name 
FROM grade G, student S 
WHERE (S.id = G.id AND 'F' NOT IN (SELECT G1.grade 
            FROM grade G1 
            WHERE G1.id = G.id)) 
     OR 
     S.id NOT IN (SELECT id 
        FROM grade) 
GROUP BY name 
相關問題