我是SQL的新手,希望在这里找到一些帮助。 英语不是我的母语,所以如果有些事情似乎不清楚,请随意提问!
与主题名称一样,我想从一个多次存在的表中过滤掉条目(字符串)。
我的代码如下所示:
SELECT DISTINCT characterid, firstname, lastname, courseid
FROM Teaches
NATURAL JOIN Character
GROUP BY characterid, firstname, lastname, courseid
它给了我这个:
任务是筛选出教授超过1门课程的所有人。在这种情况下,它将是Snape和Quirrell。 我尝试了计算
HAVING count(characterid) > 1
但那没用。如果有人可以帮助我,我会很高兴,也许可以解释为什么那个计数不起作用。提前谢谢!
编辑:如果我说“过滤器”,那么我的意思是我想把它作为结果表。所以最后我得到一个有2行的表 1)特征西弗勒斯斯内普 2)特色Quirinus Quirrell
很抱歉这么不清楚。此外,我只在SELECT语句中包含了courseid,以查看谁更清楚地教授多个课程。最终表应该只有三列“characterid”,“firstname”和“lastname”
EDIT2:这是数据库的结构。也许我完全错了,所以它对你们有帮助:结构
答案 0 :(得分:1)
为什么那个计数不起作用?由于您对courseid
进行了分组,因此只计算每个 courseid
,而不计算每个字符的所有课程
所以你应该把它改成
SELECT
characterid, firstname, lastname
FROM
Teaches
NATURAL JOIN
Character
GROUP BY
characterid, firstname, lastname
HAVING
COUNT(*) > 1;
我建议您使用INNER JOIN
代替NATURAL JOIN
。 NATURAL 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;