Проблемы с пониманием этого кода SQL - PullRequest
0 голосов
/ 06 июня 2018

Итак, я готовился к экзамену, и я столкнулся с вопросом, с которым мне как-то нужна помощь.

Код пытается найти имена моряков, которые резервируют все лодки:

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 и как они работают вместе при делении, как в случае, представленном выше.Я думаю, что я получаю то, чего не существует, и, кроме как делаю по отдельности, но вместе это мое заблуждение

1 Ответ

0 голосов
/ 06 июня 2018

Подзапрос для не существует получает все лодки, которые не находятся в резерве для этого моряка.Я бы назвал это «незарезервированные лодки для моряка».

Внешний запрос затем получает всех моряков, у которых нет лодок, которые не зарезервированы для этого моряка.Другими словами, общий запрос получает моряков, которые зарезервировали все лодки.

Это точно не то, как я бы написал запрос.Я думаю, что намерение этой версии намного яснее:

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

Примечание: для этого может потребоваться count(distinct bid), если моряк может зарезервировать одну и ту же лодку более одного раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...