无法理解这个SQL代码

时间:2018-06-06 16:43:55

标签: sql postgresql

所以我一直在考试,我遇到了一个我需要帮助的问题。

该代码试图找到保留所有船只的水手的名字:

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

现在我觉得自己得到了大部分内容,但我遇到的唯一问题是ExceptNot Exists,以及他们如上所述进行分工时如何协同工作。我认为我得到了不存在的东西,除了单独做,但我在一起是我的困惑

1 个答案:

答案 0 :(得分:1)

不存在的子查询会获得所有没有为该水手保留的船只。我会把这个"毫无保留的船叫给水手"。

外部查询然后获得所有没有为该水手无保留的船只的水手。换句话说,总体问题是得到了保留所有船只的水手。

这绝对不是我编写查询的方式。我认为这个版本的意图更加清晰:

select sid
from reserves
group by sid
having count(*) = (select count(*) from boats);

注意:这可能需要count(distinct bid),如果水手可以多次预留同一条船。