2013-03-11 2 views
0

안녕하세요 저는 물론 M1 또는 M2를 가르쳐 있지만 둘SQL 쿼리 잘못

SELECT p.empid,p.name 
FROM professor p,course c,works w 
WHERE p.empid = w.empid 
AND w.courseid = c.courseid 
AND ((c.coursename = ‘m1’ AND c.coursename != ‘m2’) 
OR 
(c.coursename = ‘m2’ AND c.coursename != ‘m1’)) 

가인가 한 직원의 목록을 반환하려면 다음 쿼리를 작성했습니다

Professor (EMP ID,Name,Status,Salary,Age) 
Course(Course ID,Course Name,PoINts) 
Works(Course ID,EMP ID,Class ID) 

다음과 같은 데이터베이스 스키마가 위의 쿼리 바로 나는 SQL에 도움이된다.

+2

노력을 기울이지 않아도 StackOverflow에 누군가가 빨리 응답 해 줄 것을 요청하는 대신 sqlfiddle.com을 사용하여 직접 답변을 찾을 수 있습니다 – gerrytan

+0

... 그리고 sqlfiddle이 결과를 산출하지 못하면 링크를 게시하십시오 여기에 적어도 우리는 무언가를 – Bohemian

답변

1

이 문제는 대개 Relational Division으로 불린다. 아래 쿼리는 m1m2과 같은 코스를 가르치는 모든 교수 이름을 가져옵니다. 교수가 필터링 된 후 뚜렷한 숫자 인 CourseName이 계산됩니다. 분명히 하나의 코스 만 가르치는 경우에는 하나를 반환합니다. :D.

  • SELECT a.EmpID, a.Name 
    FROM Professor a 
         INNER JOIN Works b 
          ON a.EmpID = b.EmpID 
         INNER JOIN Course c 
          ON b.CourseID = c.CourseID 
    WHERE c.CourseName IN ('m1', 'm2') 
    GROUP BY a.EmpID, a.Name 
    HAVING COUNT(DISTINCT c.CourseName) = 1 
    
    SQL of Relational Division
+0

에 대해 가지고있을 것입니다. 저는 m1이나 m2를 가르치는 교수님을 원합니다.하지만 둘 다 가르치지는 않겠지 만 ... –

+0

내가 아는 사람들에게 이것에 대해 감사 드리며 ... 알겠습니다. –

+0

나는있을거야. 귀하의 의견을 기다리고, 이것이 아니라면 귀하의 질문과 함께 샘플 데이터를 제공하십시오. 감사합니다':)' –

0

시도 : 이것은 가정

SELECT p.empid,p.name 
FROM professor p join works w on 
p.empid = w.empid 
having count(w.courseid) = 2 

당신이이 개 클래스 않을 때, 그것은 올바른 방향을 알려줄 것이다, 총이있다.