Сравнение с пустым набором - PullRequest
0 голосов
/ 04 октября 2018

У меня есть два отношения A и B

Таблица A

Name   Age
------------
Arun    60 
Shreya  24 
Rohit   11 

Таблица B

Name    Age
------------
Hari     40
Rohit    20
Karthik  18

select *
from A
where A.Age > all(select B.Age from B where B.Name = 'Arun');

Я знаю, что подзапрос вернет пустой набор,Я узнал, что all() будет учитывать значение NULL, если есть пустой набор.В этом случае предикат в предложении where внешнего запроса должен иметь значение UNKNOWN, тем самым устраняя все кортежи, возвращаемые предложением from.

Но запрос возвращает все кортежи из отношения A. в качестве вывода.

Пожалуйста, объясните, как функция all () обрабатывает пустой набор.

Спасибо за помощь!

1 Ответ

0 голосов
/ 04 октября 2018

ALL делает именно то, что говорит.Он сравнивает A.age с каждым значением, возвращаемым запросом.Фильтр проходит, если A.age больше, чем все значения B.age.

Нет значений, так что это правда.

Вы путаете пустой набор результатов с результатомнабор, в котором есть строка с NULL.Это разные вещи.

Между прочим, я обычно пишу эту логику как:

select *
from A
where A.Age > (select max(B.Age) from B where B.Name = 'Arun');

В этом случае сравнение не является набором;сравнение со скалярным значением.И скалярное значение равно NULL, потому что подзапрос не возвращает строк.Таким образом, это не возвращает строк в этой ситуации.Результаты совпадают, когда ваш подзапрос возвращает любые строки.

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