数据库/ SQL边缘案例

时间:2017-11-29 02:44:35

标签: mysql sql database oracle

好的,所以我被卡住了。显然,我缺少边缘情况......如果申请人拥有除技能表技能之外的更多技能,则不会返回该人。这是确切的情况和我目前的解决方案。请帮助我理解我错过的或我出错的地方,因为我无法理解,因为我觉得我的确是正确的。

状况:

  

假设有两个表:申请人(姓名,技能)和技能(技能)   一个申请人可能有多种技能。创建一个SQL查询报告:   谁拥有技能表中列出的所有技能只需提交SQL   声明

我痴迷的解决方案:

SELECT name
FROM applicant
HAVING Count(skill) = (SELECT Count(skill) FROM skills)
GROUP BY(name);

2 个答案:

答案 0 :(得分:0)

你非常接近:

SELECT name
FROM applicant
GROUP BY name
HAVING Count(skill) = (SELECT Count(skill) FROM skills);

如果可能有重复项,您可以这样做:

SELECT name
FROM applicant
GROUP BY name
HAVING Count(DISTINCT skill) = (SELECT Count(skill) FROM skills);

答案 1 :(得分:0)

因此,问题是申请人可能具有未在SKILLS表中列出的技能。那很糟糕; SKILLS表中的技能应该是主键,应该限制APPLICANT表中的技能 - 外键 - 所以它们不能是SKILLS表中存在的任何东西。

根据情况,除了Gordon已经修复的语法错误之外,还有其他两个逻辑问题(除了重复技能之外,Gordon指出)。申请人可能拥有的技能超过了SKILLS表中列出的技能。他们也可能拥有与该表中相同数量的技能,但他们可能会错过一两个 - 而是拥有一个或两个UNLISTED技能。

因此,在计算之前,您需要将APPLICANT表中的技能限制为SKILLS表中存在的技能。

select   name
from     applicant
where    skill in (select skill from skills)
group by name
having   count(distinct skill) = (select count(skill) from skills)