从表中选择与另一个表没有关系的表

时间:2014-11-05 21:29:58

标签: mysql

具体问题是列出从未评分的教师姓名。

我有'教师'表,其中包含“名称”和“ID”列 “成绩”表格中包含“IDTeacher”和“成绩”列。

不明白为什么这不起作用:

Select Name from teachers where not exists(Select * from grades, teachers)

2 个答案:

答案 0 :(得分:5)

你可以将它与成绩表一起加入,并使用右边的连接返回“null”的那些:

SELECT
   name
from
   teachers t
LEFT JOIN
   grades g
on
   t.teacher = g.teacher
WHERE
   ISNULL(g.teacher)

编辑:如果教师在成绩表中有条目,则考虑右键加入,但不是,正确的加入可能不起作用。 (然后你会完全想念他,即使他在teacher表中)

你也可以使用WHERE IN

SELECT 
  name 
FROM 
  teachers 
WHERE 
  name 
NOT IN (SELECT name from grades)

MySQL Optimizer会将其重写为@Gordon Linoff编写的相关子查询。使用WHERE NOT IN更容易阅读imho。

答案 1 :(得分:3)

您的查询正常工作,它只是没有做您认为应该做的事情。子查询在两个表之间创建笛卡尔积。如果两个表都有行,则笛卡尔积具有行,where子句将始终为真。

您可以采用这种方法,但需要相关的子查询:

Select Name
from teachers t
where not exists (Select 1 from grades g where g.idteacherid = t.id);

请注意,此查询在子查询中只有一个表。

还有其他方法可以编写此查询,但这似乎是您要进入的方法。而且,not exists是一种非常合理的方法。