我想显示一个值符合条件的结果:结果必须显示没有在"AS"课程中讲课的人,然后沿着这个名字还显示他/她的电话号码。我想到的自然语言格式是从表中选择不同的namn,如果namn有昵称值'AS',则点不显示该namn。从finalver2中选择distinct namn,tel,其中昵称<>'AS’;李的名字仍然会出现,因为她还有一个硕士班,我不希望她的名字出现。
结果应该是这样的:
namn tel
Faramarz 1054
上述结果应从以下场景中检索:
nickname kkod namn sport ford tel
---------- ---------- ---------- ---------- ---------- ----------
eGOV TIG098 Lisen Fotboll Cykel 1076
AS TIG162 Lisen Fotboll Cykel 1076
AS TIG162 Lisen Fotboll Cykel 1076
AS TIG162 Lisen Fotboll Cykel 1076
BSS TIG163 Faramarz Fotboll Cykel 1054
BSS TIG163 Faramarz Fotboll Cykel 1054
BSS TIG163 Faramarz Fotboll Cykel 1054
BSS TIG163 Faramarz Fotboll Cykel 1054
Masters TIA019 Lisen Fotboll Cykel 1076
我应该如何表达select语句?感谢帮助!
您可以使用group by
教师名称,并使用having
子句对从未讲授过'AS'
课程的教师进行筛选。
select naam, tel
from mytable
group by nanm, tel
having max(nickname = 'AS') = 0
诀窍是在尝试选择不匹配的行时不要过滤掉所需的行。也许类似于:
SELECT DISTINCT profs.namn, profs.tel
FROM (SELECT DISTINCT namn, tel FROM Courses) as profs
LEFT JOIN Courses c ON profs.namn = c.namn AND c.nickname = 'AS'
WHERE c.namn IS NULL
子查询(profs(为您提供了一份每位教授及其电话号码的列表,没有重复(注意,如果他们列出了多个电话号码,您将分别获得每个电话号码(。然后将整个表LEFT JOINed与每个教授的课程配对,但ON子句也将这些匹配限制为您希望排除的课程(您也可以使用IN和多个值的列表(,因此,只有那些没有教授"AS"类(或者任何IN列表,如果你使用的话(的教授才会无法匹配ON子句,并在外部联接的结果中导致c表的NULL值。
WHERE子句是在计算外部联接之后应用的,它只选择那些具有NULL值的联接,换句话说,那些不教授指定类的联接。外部SELECT中的DISTINCT可能不是必需的。当使用外部联接时,条件在WHERE或特定ON子句中的位置非常重要。
可能还有其他方法可以做到这一点;我不确定这是否是最好的,但我认为它会起作用。使用Count、GROUP BY和HAVING可能有一种方法可以做到这一点,但我认为它最终的复杂性大致相同(结构非常相似(,而且没有那么灵活。