2017-11-29 1 views
1

그래, 내가 붙어있어. 분명히, 나는 최후의 경우를 놓치고있다. .. 지원자가 기술 테이블의 기술 이외의 다른 기술을 가지고 있으면, 그 사람을 돌려 보내지 않을 것이다. 여기에 정확한 상황과 내가 가진 현재의 해결책이 있습니다. 제가 놓친 부분이나 내가 잘못한 부분을 이해할 수 있도록 도와주세요. 왜냐하면 내가 가지고있는 것 같은 기분이 들기 때문에 알아낼 수 없기 때문입니다.데이터베이스/SQL 엣지 케이스

상황 :

두 개의 테이블이 있다고 가정 : 신청자 (이름, 기술) 및 기술 (기술) 한 신청자는 여러 기술을 가질 수있다. 보고 할 SQL 쿼리를 확인하십시오 를 그냥 SQL 문에게 제출 한 기술 표에 나와있는 모든 능력을 가지고 누가

MY 시도 해결책 :

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

답변

0

따라서 문제는 신청자가 기술 테이블에 나열되지 않은 기술을 가지고있을 수 있다는 것입니다. 그것은 꽤 나쁘다. SKILLS 테이블의 스킬은 1 차 키이어야하며 APPLICANT 테이블의 스킬은 외부 키가 제한되어야합니다. 따라서 스킬 테이블에있는 스킬은 아무것도 될 수 없습니다.

Gordon이 이미 고쳐 쓴 구문 오류 외에도 다른 두 가지 논리적 인 문제가 있습니다 (Gordon이 지적한 중복 기술 외에도). 지원자는 기술 표에 나열된 것보다 더 많은 기술을 보유 할 수 있습니다. 또한 테이블에있는 것과 같은 수의 스킬이있을 수 있지만, 하나 또는 두 개를 놓칠 수 있습니다. 대신 하나 또는 두 개의 기술이 있습니다.

따라서 계산하기 전에 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) 
0

당신은 아주 가까이 있습니다

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

중복 될 수있는 경우 다음을 수행합니다.