【问题标题】:SQL: Filter out entries that appear more than onceSQL:过滤掉多次出现的条目
【发布时间】:2016-06-18 09:34:36
【问题描述】:

我是 SQL 新手,希望在这里能找到一些帮助。 英语不是我的母语,所以如果有不清楚的地方,请随时提问!

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

我的代码如下所示:

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

它给了我这个:

表格

任务是过滤掉所有教授超过 1 门课程的人。在这种情况下,它将是斯内普和奇洛。 我试过数数

HAVING count(characterid) > 1

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

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

抱歉,不清楚。另外,我只在 SELECT 语句中包含了 courseid,以便更清楚地查看谁教的课程不止一门。决赛桌应该只有“characterid”、“firstname”和“lastname”三列

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

【问题讨论】:

  • 您使用的是哪个 DBMS?

标签: sql


【解决方案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 不标准,不干净,对 coder 不可见(别人不知道你想加入哪些列,所以不可读)

根据您的评论,我假设您希望获得在任何一年、任何职位上教授超过 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;

【讨论】:

  • 您好!感谢您的快速反馈和提示。我按照您的建议进行了尝试,结果是Table2。这与我将其与 courseid 分组时得到的结果相同 :( 确保我也将其作为解决方案上传到我们的练习服务器上并且反馈是否定的
  • 我在第一篇文章中包含了该结构。也许我开始完全错了structure
  • @djaru 好像问题出在你的桌子上。你能运行这个查询并显示结果吗?:SELECT * FROM teaches t INNER JOIN character c ON t.characterid = c.characterid WHERE c.characterid = 5; 根据你的回复,这个查询必须返回超过 1 行。
  • @djaru 对于您的情况,您应该在我编辑的答案中使用第二个查询
猜你喜欢
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
相关资源
最近更新 更多