-5

显示订阅了 Football 和 Chess 但未订阅 Tennis 的员工的详细信息。

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');  

第一个给出正确的结果。

4

1 回答 1

5

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

第二个查询: 所有订阅 Chess 或 football 的 empid。

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

于 2012-01-05T09:49:02.443 回答