具体问题是列出从未评分的教师姓名。
我有'教师'表,其中包含“名称”和“ID”列 “成绩”表格中包含“IDTeacher”和“成绩”列。
不明白为什么这不起作用:
Select Name from teachers where not exists(Select * from grades, teachers)
答案 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
是一种非常合理的方法。