2012-01-05 4 views
-5

축구 및 체스에 가입했지만 테니스에 가입하지 않은 직원의 세부 정보를 표시합니다.두 쿼리가 다른 이유는 무엇입니까?

SELECT * 
FROM employee 
WHERE empid IN (SELECT empid 
       FROM subscription 
       WHERE facid IN (SELECT facid 
            FROM facility 
            WHERE facility = 'Chess' 
              OR facility = 'Football')) 
     AND empid NOT IN (SELECT empid 
         FROM subscription 
         WHERE facid = (SELECT facid 
             FROM facility 
             WHERE facility = 'Tennis')); 

SELECT DISTINCT empid 
FROM subscription 
WHERE facid IN (SELECT facid 
       FROM facility 
       WHERE facility = 'Chess' 
         OR facility = 'Football') 
     AND facid != (SELECT facid 
        FROM facility 
        WHERE facility = 'Tennis'); 

첫 번째 것은 올바른 결과를 제공합니다.

+1

JOIN에 대해 들어 보셨습니까? –

+2

데이터를 보지 않고 "올바른 결과"가 무엇인지, "잘못된 결과"가 무엇인지 이해하면 해결할 수 없습니다. – Oded

+0

@Oded : 데이터가 없어도 두 번째 쿼리의 AND가 어떻게 작동하는지 설명하십시오. –

답변

5

첫 번째 쿼리 : 체스 또는 축구에 가입했지만 테니스의 구독이없는 모든 직원.

두 번째 쿼리 : 체스 또는 축구에 가입 한 모든 empid.

두 번째 쿼리는 구독을 필터링하고 하나의 구독은 하나의 기능 만 연결할 수 있습니다. 즉, 체스를 구독하는 경우 테니스에 가입하지 않아도되며 테니스에 가입하면 체스 나 축구가 아니기 때문에 이미 제외됩니다. 체스 테니스를 모두 구독하는 EmpID는 체스 가입으로 인해 포함되지만 테니스의 가입으로 인해 이 아닌이 제외됩니다.

+0

수정 된 편집. 지금? –

+0

미카엘 (Mikael)은 두 번째 쿼리에서 facid! = (...)가 전혀 도움이되지 않는다고 설명하려고했습니다. 당신이 이것을 쓰는 방법은 당신이 특정 facid 's를 제외하려고 시도하고 있다는 것을 의미합니다. 그러나 그 배제는 facid가 체스 나 축구에 연결 되어야만하기 때문에 이미 수행되었습니다. 그러나 정말로 배제하고 싶은 것은 직원입니다. 그러므로 쿼리를 수행하려면 반드시 "AND empid NOT IN (...)"과 같이 동작해야합니다. NOT "AND facid NOT IN (...)". –

+0

@ 에윈 - 그 코멘트 이후의 대답을 바꿨습니다. 그리고 팝 씨는 대답을 받아 들였으므로 지금은 질문 사이의 차이점을 알고있을 것이라고 확신합니다. –

관련 문제