如何确保Number列值大于1?已尝试HAVING子句但结果异常
嘿,我来帮你看看这个问题~
你想筛选出技能数量大于1的员工,但加了HAVING Number>1后结果不对,只返回1行,大概率是你的SQL结构或者统计逻辑有问题,我们一步步来拆解:
首先看你原来的SQL,其实子查询是多余的——你在子查询里拉了Skill的字段,但外层查询根本没用到这些字段,反而可能因为RIGHT JOIN引入了不必要的记录(比如EmployeeSkill里关联了Skill表中不存在的SkillID,这些记录的Skill字段会是NULL,但依然会被COUNT(*)统计进去)。
给你几个针对性的解决方案:
方案1:直接统计员工的技能关联数(包含所有关联记录)
如果你的需求是只要员工在EmployeeSkill表中有超过1条记录(不管Skill是否存在),可以直接简化SQL,不需要子查询:
SELECT EmployeeSkill.EmployeeID, COUNT(*) AS "Number" FROM EmployeeSkill GROUP BY EmployeeSkill.EmployeeID HAVING COUNT(*) > 1;
方案2:统计员工拥有的有效技能数(仅Skill表中存在的技能)
如果你只想统计Skill表中存在的技能数量,那应该用INNER JOIN而不是RIGHT JOIN,这样只会保留有对应Skill的关联记录:
SELECT EmployeeSkill.EmployeeID, COUNT(*) AS "Number" FROM Skill INNER JOIN EmployeeSkill ON EmployeeSkill.SkillID = Skill.SkillID GROUP BY EmployeeSkill.EmployeeID HAVING COUNT(*) > 1;
方案3:去重统计不同技能数(避免重复关联的影响)
如果EmployeeSkill表中存在同一个员工重复关联同一个SkillID的情况(比如误操作添加了多次),可以用COUNT(DISTINCT Skill.SkillID)来统计不同的技能数量:
SELECT EmployeeSkill.EmployeeID, COUNT(DISTINCT Skill.SkillID) AS "Number" FROM Skill INNER JOIN EmployeeSkill ON EmployeeSkill.SkillID = Skill.SkillID GROUP BY EmployeeSkill.EmployeeID HAVING COUNT(DISTINCT Skill.SkillID) > 1;
你可以根据自己的实际需求选择对应的方案,应该就能解决只返回1行的问题啦~
内容的提问来源于stack exchange,提问作者ratdog
相关产品推荐
相关产品推荐

