Mysql 数据库/SQL边缘案例

Mysql 数据库/SQL边缘案例,mysql,sql,database,oracle,Mysql,Sql,Database,Oracle,好吧,我被卡住了。显然,我缺少边缘案例。。。如果申请人拥有技能表中技能以外的更多技能,则不会退回该人员。以下是我的确切情况和当前解决方案。请帮助我理解我遗漏了什么,或者我错在哪里,因为我无法理解,因为我觉得我所拥有的是正确的 情况: 假设有两个表:申请人(姓名、技能)和技能(技能) 一个申请人可能有多种技能。进行SQL查询以报告: 谁拥有技能表中列出的所有技能只需提交SQL 声明 我尝试的解决方案: SELECT name FROM applicant HAVING Count(skill) =

好吧,我被卡住了。显然,我缺少边缘案例。。。如果申请人拥有技能表中技能以外的更多技能,则不会退回该人员。以下是我的确切情况和当前解决方案。请帮助我理解我遗漏了什么,或者我错在哪里,因为我无法理解,因为我觉得我所拥有的是正确的

情况:

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

我尝试的解决方案:

SELECT name
FROM applicant
HAVING Count(skill) = (SELECT Count(skill) FROM skills)
GROUP BY(name);
你很接近:

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);

因此,问题在于,申请人可能拥有技能表中未列出的技能。那太糟糕了;技能表中的技能应该是主键,而申请者表中的技能应该受到约束-外键-因此它们只能是技能表中存在的技能

select   name
from     applicant
where    skill in (select skill from skills)
group by name
having   count(distinct skill) = (select count(skill) from skills)
目前的情况是,除了Gordon已经修复的语法错误外,还有两个逻辑问题(除了Gordon指出的重复技能)。申请人的技能可能超过技能表中列出的技能。他们也可能拥有与该表中相同数量的技能,但他们可能会错过一到两项技能,而是拥有一到两项未列出的技能

因此,在计算之前,需要将申请表中的技能限制为技能表中存在的技能

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