为什么这两个查询不同?

pop*_*ack -5 sql relational-algebra logical-operators

显示订阅了足球和国际象棋而不是网球的员工的详细信息.

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');  
Run Code Online (Sandbox Code Playgroud)

第一个给出正确的结果.

Mik*_*son 5

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

第二个查询: 所有已经订阅国际象棋或足球的empid.

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