SQL:过滤掉多次出现的条目

时间:2016-06-18 09:34:36

标签: sql

我是SQL的新手,希望在这里找到一些帮助。 英语不是我的母语,所以如果有些事情似乎不清楚,请随意提问!

与主题名称一样,我想从一个多次存在的表中过滤掉条目(字符串)。

我的代码如下所示:

SELECT DISTINCT characterid, firstname, lastname, courseid
FROM Teaches
NATURAL JOIN Character
GROUP BY characterid, firstname, lastname, courseid

它给了我这个:

表格 enter image description here

任务是筛选出教授超过1门课程的所有人。在这种情况下,它将是Snape和Quirrell。 我尝试了计算

HAVING count(characterid) > 1

但那没用。如果有人可以帮助我,我会很高兴,也许可以解释为什么那个计数不起作用。提前谢谢!

编辑:如果我说“过滤器”,那么我的意思是我想把它作为结果表。所以最后我得到一个有2行的表 1)特征西弗勒斯斯内普 2)特色Quirinus Quirrell

很抱歉这么不清楚。此外,我只在SELECT语句中包含了courseid,以查看谁更清楚地教授多个课程。最终表应该只有三列“characterid”,“firstname”和“lastname”

EDIT2:这是数据库的结构。也许我完全错了,所以它对你们有帮助:结构

enter image description here

1 个答案:

答案 0 :(得分:1)

为什么那个计数不起作用?由于您对courseid进行了分组,因此只计算每个 courseid,而不计算每个字符的所有课程

所以你应该把它改成

SELECT  
    characterid, firstname, lastname
FROM 
    Teaches
NATURAL JOIN 
    Character
GROUP BY 
    characterid, firstname, lastname
HAVING 
    COUNT(*) > 1;

我建议您使用INNER JOIN代替NATURAL JOINNATURAL JOIN不是标准的,不是干净的,对编码器是不可见的(其他人不知道你想加入哪些列,所以它不可读)

根据你的评论,我认为你想要获得在任何一年,任何职位上教授超过1门课程的所有角色。

因此,对于您的情况,您应该使用(如果您想进入任何学校,然后删除子查询中的t.schoolid):

SELECT
    characterid, firstname, lastname
FROM
    (
    SELECT DISTINCT
        c.characterid, c.firstname, c.lastname, t.courseid, t.schoolid
    FROM 
        Teaches t
    INNER JOIN 
        Character c
    ON
        t.characterid = c.characterid
    )
GROUP BY 
    characterid, firstname, lastname
HAVING 
    COUNT(*) > 1;