2011-04-17 103 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