2012-01-05 1 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

Вы слышали о ПРИСОЕДИНИТЕСЬ? –

+2

Не видя данных, понимая, что такое «правильный результат» и что такое «неправильный результат», мы не можем помочь. – Oded

+0

@Oded: Несмотря на отсутствие данных, просто объясните, как ведет себя И во втором запросе. –

ответ

5

Первый запрос: Все сотрудники, подписавшиеся на шахматы или футбол, но не имеющие подписки на теннис.

Второй запрос: Все эмпирии, подписавшиеся на шахматы или футбол.

Ваш второй запрос - это фильтрация подписки, и одна подписка может привязываться только к одному объекту. Это означает, что если у вас есть подписка на Chess, она, конечно же, не будет подпиской на теннис, и если вы найдете подписку на теннис, она будет исключена из-за того, что это не шахматы или футбол. Любой EmpID, который подписывается на оба Chess и Теннис будет включен из-за подписки на Chess, но будет не исключить из-за подписки на теннис.

+0

отредактирован с исправлениями. Теперь? –

+0

Mikael попытался объяснить вам, что AND facid! = (...) в вашем втором запросе ничего не полезен вообще. То, как вы это пишете, означает, что вы пытаетесь исключить определенные лица, но это исключение уже сделано в силу того, что фасад должен быть связан с шахматами или футболом. Но то, что вы действительно хотите исключить, - это сотрудники. Поэтому для вашего запроса, чтобы достичь этого, он должен обязательно содержать что-то, что ведет себя как «И НЕОБХОДИМЫЕ НЕ ВХОДЫ (...)». НЕ "И ФАЙЛ НЕ ВКЛЮЧЕН (...)". –

+0

@Erwin - Я изменил ответ после этого комментария, и я уверен, что г-н Поп знает разницу между запросами сейчас, так как он принял ответ. –