2016-06-18 96 views
0

我是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)characterid Severus Snape 2)characterid Quirinus Quirrell

对不起,因为如此不清楚。此外,我仅在SELECT语句中包含courseid,以便更清楚地了解谁教授多个课程。决赛桌应该只有三列“characterid”,“firstname”和“lastname”。编辑2:这里是数据库的结构。也许我是完全错误的,因此可帮助你们:结构

enter image description here

+0

哪些DBMS您使用的? –

回答

1

为什么计数没有工作?因为你组courseid,所以它只能算为每个courseid,不是每个或CharacterId数所有课程

所以,你应该将其更改为

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; 
+0

你好!感谢您的快速反馈和提示。我试着按照你的建议,结果是这[表2](http://i.imgur.com/9yRyE9d.png)。当我将它与courseid分组时,得到的结果是一样的:(确保我也将它作为解决方案上传到我们的练习服务器上,并且反馈是否定的 – djaru

+0

我在第一篇文章中包含了该结构,也许我开始完全错误[结构](http://i.stack.imgur.com/R3LF6.png) – djaru

+0

@djaru看起来问题出在你的表中,你能运行这个查询并显示结果吗?:'SELECT * FROM teachhes t INNER JOIN字符c ON t.characterid = c.characterid WHERE c.characterid = 5;'根据你的回复,这个查询必须返回多于1行 –