ИСКЛЮЧИТЬ команду - Найти моряков, которые забронировали все лодки

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

  • У нас есть 3 таблицы:
    1. Моряки: sid, sname, рейтинг, возраст (основной: sid)
    2. Лодки: ставка (основной: ставка)
    3. Резервы: 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))

Мои вопросы:

  1. Что-то не так с вышеуказанным запросом? Когда я помещаю его в MySQL Workbench, он показывает, что у меня есть синтаксическая ошибка с EXCEPT

  2. Помимо решения, указанного в вышеприведенной книге, есть ли другой способ выполнить запрос: найти моряков, которые забронировали все лодки

Спасибо,

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);
Другие вопросы по тегам