2013-04-20 4 views
1

Я учусь на выпускной экзамен, и это приходит в прошлом экзамена:Что делает этот запрос?

Таблица: Медсестра - (нидь: INT, NNAME: строка, возраст: реальная, заработная плата: реальный, SID : ИНТ)
Таблица: Supervisor - (с.и.д.: INT, рейтинг: реальный)
Таблица: WorksIn - (нидь: INT, спрятанные: INT, часы: реальные)
Таблица: больница - (hid: int, hname: string, tid: int)
Таблица: Город - (TID: INT, TName: строка, мэр: строка)

Объясните, что следующий запрос возвращает:

SELECT nname 
FROM Nurse N 
WHERE NOT EXISTS 
    ( (SELECT H.hid 
      FROM Hospital H 
      WHERE H.town = ‘Toronto’) 
    EXCEPT 
     (SELECT W.hid 
     FROM WorksIn W 
     WHERE N.nid = W.nid)) 

Что этот запрос делать? Я могу понять, что подзапрос возвращает все больницы в Торонто, в которых нет работы медсестры, но я не знаю, как это связано с частью NOT EXIST.

+2

Хороший вопрос бумага! :) –

+1

NOT EXISTS - это оператор, который возвращает false, если в подзапросе, который он ссылается, есть какие-либо строки в нем, а true - в противном случае. Таким образом, он выберет всех медсестер, для которых этот подзапрос возвращает 0 строк. – Patashu

+1

Пожалуйста, не оставляйте вопросы, которые содержат большую часть содержимого изображения, если это не требуется для заданного вопроса. Это делает невозможным копирование/вставку любого содержимого для тестирования, и это ужасно для тех, кто посещает сайт с мобильных устройств. Благодарю. :-) –

ответ

6

Рассмотрим поэтапно:

The set of nurses where 
    there does not exist 
    a hospital in Toronto where the nurse doesn't work. 

По закону исключенного третьего это становится

The set of nurses where 
    the nurse works in all Toronto hospitals 

Примечание эти вопросы, поднятые в ходе обсуждения с комментатора:

  • Суб-запрос оценивается отдельно для каждой медсестры, а не отдельно по набору всех медсестер
  • То есть каждая медсестра такая, что множество больниц Торонто, где медсестра не работает, - это пустой набор. Значение для каждой медсестры (ов) он работает во всех больницах Торонто.
  • Прочитайте подзапрос как «Набор больниц Торонто За исключением (прочитайте как установленные различия или минус) больницы, где работает медсестра».
+0

У меня другая интерпретация (см. Ниже). Что мне здесь не хватает? –

+0

OK. Теперь я согласен. Спасибо за объяснение. –

0

Для каждой отдельной медсестры суб-запрос занимает все больницы в Торонто и исключает все больницы, где он/она работает. Это оставляет нам больницы Торонто, где он/она не работает. Чтобы удовлетворить NOT EXIST, такой список для этой медсестры должен быть пустой. Поэтому эта медсестра должна работать в каждой больнице Торонто.

Таким образом, запрос возвращает медсестры, которые работают во всех больницах Торонто..

Учитывая размер Торонто и количество его больниц, это не гуманно, но это, тем не менее, ответ.

+0

Суб-запрос оценивается отдельно для каждой медсестры, а не отдельно от набора всех медсестер. –

+0

То есть для каждой медсестры множество больниц Торонто, где медсестра не работает, - это пустой набор. Значение для каждой медсестры (ов) он работает во всех больницах Торонто. –

+0

Набор больниц Торонто ** За исключением ** (читайте как установленные различия или минус) больницы, где работает медсестра. –

Смежные вопросы