为什么这两个查询不同?

时间:2012-01-05 09:35:45

标签: sql logical-operators relational-algebra

显示已订阅足球和国际象棋而非网球的员工的详细信息。

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 个答案:

答案 0 :(得分:5)

第一次查询: 所有订阅国际象棋或足球但没有订阅网球的员工。

第二次查询: 所有已经订阅国际象棋或足球的女主角。

您的第二个查询是过滤订阅,一个订阅只能链接到一个设施。这意味着,如果您订购国际象棋,当然不会同时订购网球,如果您发现网球订阅,它将被排除,因为它不是国际象棋或足球。任何同时订购国际象棋网球的EmpID都会被包括在内,因为国际象棋的订阅会因为订阅网球而被排除在外。