如何将select语句表述为如果某个属性达到某个域值;选择不存在的值



我想显示一个值符合条件的结果:结果必须显示没有在"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可能有一种方法可以做到这一点,但我认为它最终的复杂性大致相同(结构非常相似(,而且没有那么灵活。

最新更新