所以我一直在考试,我遇到了一个我需要帮助的问题。
该代码试图找到保留所有船只的水手的名字:
SELECT
S.sname
FROM
Sailors S
WHERE
NOT EXISTS ((SELECT B.bid
FROM Boats B)
EXCEPT
(SELECT R.bid
FROM Reserves R
WHERE R.sid = S.sid))
现在我觉得自己得到了大部分内容,但我遇到的唯一问题是Except
和Not Exists
,以及他们如上所述进行分工时如何协同工作。我认为我得到了不存在的东西,除了单独做,但我在一起是我的困惑
答案 0 :(得分:1)
不存在的子查询会获得所有没有为该水手保留的船只。我会把这个"毫无保留的船叫给水手"。
外部查询然后获得所有没有为该水手无保留的船只的水手。换句话说,总体问题是得到了保留所有船只的水手。
这绝对不是我编写查询的方式。我认为这个版本的意图更加清晰:
select sid
from reserves
group by sid
having count(*) = (select count(*) from boats);
注意:这可能需要count(distinct bid)
,如果水手可以多次预留同一条船。