2014-01-30 3 views
2

이러한 테이블은 다음과 같습니다MySQL의 쿼리 조인과 서브 쿼리

professor: 
+-------+--------+--------+--------+------+ 
| empid | name | status | salary | age | 
+-------+--------+--------+--------+------+ 
|  1 | Arun |  1 | 2000 | 23 | 
|  2 | Benoy |  0 | 3000 | 25 | 
|  3 | Chacko |  1 | 1000 | 36 | 
|  4 | Divin |  0 | 5000 | 32 | 
|  5 | Edwin |  1 | 2500 | 55 | 
|  7 | George |  0 | 1500 | 46 | 
+-------+--------+--------+--------+------+ 
works: 
+----------+-------+---------+ 
| courseid | empid | classid | 
+----------+-------+---------+ 
|  1 |  1 |  10 | 
|  2 |  2 |  9 | 
|  3 |  3 |  8 | 
|  4 |  4 |  10 | 
|  5 |  5 |  9 | 
|  6 |  1 |  9 | 
|  2 |  3 |  10 | 
|  2 |  1 |  7 | 
+----------+-------+---------+ 

course: 
+----------+------------+--------+ 
| courseid | coursename | points | 
+----------+------------+--------+ 
|  1 | Maths  | 100 | 
|  2 | Science |  80 | 
|  3 | English |  85 | 
|  4 | Social  |  90 | 
|  5 | Malayalam |  99 | 
|  6 | Arts  |  40 | 
+----------+------------+--------+ 

질문은 : 물론 수학이나 과학하지만 둘

을 가르쳐 직원의

반환 목록

내가 작성한 검색어는 다음과 같습니다.

select distinct professor.name from professor 
inner join works 
on professor.empid=works.empid 
where works.courseid in 
(select courseid from course where coursename ='Maths' or coursename='Science'); 

내가받은 출력은 다음과 같습니다

여기
Arun 
Benoy 
Chacko 

직원 '아룬'야해 배운 수학과 과학 모두 그가로 표시되어있다.

도와주세요!

답변

3

집합체 COUNT()을 사용하면 두 가지 유형의 코스로 계속 필터링하면서 가르친 총 DISTINCT 코스 수를 정확하게 1로 확인할 수 있습니다. 이는 둘 중 하나만 반환된다는 것을 보장합니다.

IN()은 처음에 두 개의 원하는 코스에만 반환되는 모든 행을 제한하기 때문에 교수는 COUNT(DISTINCT coursename)을 통해 최대 2 개의 가능한 코스를 가질 수 있습니다. HAVING 절은 최종 결과 집합에서 2가있는 절을 금지합니다. http://sqlfiddle.com/#!2/2e9610/2

0

당신은 or 대신 여기에 xor를 사용하려면 : 여기

SELECT 
    DISTINCT professor.name 
FROM 
    professor 
    INNER JOIN works ON professor.empid = works.empid 
    /* Join against course to get the course names */ 
    INNER JOIN course ON works.courseid = course.courseid 
WHERE 
    /* Restrict only to Maths, Science */ 
    course.coursename IN ('Maths', 'Science') 
GROUP BY professor.name 
/* Only those with exactly one type of course */ 
HAVING COUNT(DISTINCT course.coursename) = 1 

는 데모입니다.

select distinct professor.name from professor 
inner join works 
on professor.empid=works.empid 
where works.courseid in 
(select courseid from course where coursename ='Maths' xor coursename='Science');