ИСКЛЮЧИТЬ команду - Найти моряков, которые забронировали все лодки
Я читаю учебник, и я не понимаю этот запрос: найти моряков, которые зарезервировали все лодки.
- У нас есть 3 таблицы:
- Моряки: sid, sname, рейтинг, возраст (основной: sid)
- Лодки: ставка (основной: ставка)
- Резервы: sid, bid, день (первичный, sid, bid, день) (sid - внешний ключ для моряков, bid - внешний ключ для лодок)
Для запроса "Найти моряков, которые зарезервировали все лодки", дан ответ:
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))
Мои вопросы:
Что-то не так с вышеуказанным запросом? Когда я помещаю его в MySQL Workbench, он показывает, что у меня есть синтаксическая ошибка с EXCEPT
Помимо решения, указанного в вышеприведенной книге, есть ли другой способ выполнить запрос: найти моряков, которые забронировали все лодки
Спасибо,
3 ответа
Вы можете сделать это, используя COUNT и CONCAT. Этот запрос выбирает моряков, которые в паре (в таблице резервов) с каждой лодкой в таблице лодок:
SELECT Sailors.name
FROM Sailors INNER JOIN
(SELECT Reserves.sid
FROM Reserves
GROUP BY Reserves.sid
HAVING COUNT(DISTINCT CONCAT(Reserves.sid, Reserves.bid)) =
(SELECT COUNT(DISTINCT Boats.bid)
FROM Boats)) sub
ON Sailors.sid = sub.sid
Протестировано здесь: http://sqlfiddle.com/
Когда-то я видел это EXCEPT
не работают из-за несовместимости с установленной версией MySql
, Ниже приведен запрос, который можно использовать вместо вашего с помощью NOT EXISTS
,
SELECT S.sname
FROM Sailors S
WHERE NOT EXISTS (SELECT B.bid
FROM Boats B
WHERE NOT EXISTS(SELECT R.bid
FROM Reserves R
WHERE R.bid = B.bid
AND R.sid = S.sid));
Следующий запрос должен быть использован:
SELECT sname FROM Sailors s ,Reserves r WHERE s.sid=r.sid AND r.bid=ALL(SELECT b.bid FROM boats b);