У нас есть несколько лодок, которые могут быть зарезервированы моряками. Моряки зарегистрированы, и мы их знаем. Итак, структура таблиц:
[Table: Boats] [Table: Sailors] [Table: Reserves]
+-----+--------+ +-----+----------+ +-----+-----+-----+
| bid | bname | | sid | sname | | rid | bid | sid |
+-----+--------+ +-----+----------+ +-----+-----+-----+
| 1 | Boat 1 | | 1 | Sailor 1 | | 1 | 1 | 1 |
| 2 | Boat 2 | | 2 | Sailor 2 | | 2 | 2 | 3 |
| 3 | Boat 3 | | 3 | Sailor 3 | +-----+-----+-----+
+-----+--------+ +-----+----------+
В приведенных выше данных, когда вам нужно знать, какие лодки не зарезервированы; вы можете использовать приведенный ниже запрос, который даст вам ставку => 3:
SELECT B.bid FROM Boats B
EXCEPT
SELECT R.bid FROM Reserves R;
И когда вам нужно знать, какие лодки (никогда) не забронированы моряком; вы можете использовать приведенный ниже запрос, который даст вам ставку => [1, 3] для sid = 3:
SELECT B.bid FROM Boats B
EXCEPT
SELECT R.bid FROM Reserves R WHERE R.[sid] = 3;
И когда моряк зарезервирует все лодки, приведенный выше запрос не даст результата, поэтому NOT EXISTS(<above query>)
будет верным. Теперь вы можете использовать приведенный выше запрос, чтобы найти моряков, которые резервируют все лодки следующим образом:
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]);
Итак, если данные Reserves
станут примерно такими:
[Table: Reserves]
+-----+-----+-----+
| rid | bid | sid |
+-----+-----+-----+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 3 | 1 |
+-----+-----+-----+
Ваш запрос даст результат Sailor 1
;).
Дополнительная информация:
EXCEPT
возвращает отдельные строки из левого входного запроса, которые не выводятся правым входным запросом.
EXISTS
: указывает подзапрос для проверки для существования строк.
person
shA.t
schedule
12.10.2015