Эквивалентный запрос дает другой результат - PullRequest
0 голосов
/ 19 сентября 2019

Я считаю, что следующие запросы эквивалентны и должны давать тот же результат:

select CITY from TBL_X
where CITY not in (
  select CITY from TBL_X
  where CITY in (
    select CITY 
    from TBL_Y
  )
)


select CITY 
from TBL_X
where CITY not in (
  select CITY 
  from TBL_Y
);

Но первый запрос дает 10 строк данных, а второй - 0 строк данных.Есть ли логическое объяснение этому?

1 Ответ

4 голосов
/ 19 сентября 2019

Не используйте not in с подзапросом.Он не возвращает строк, когда любое значение, возвращаемое подзапросом, равно NULL.

Вместо этого используйте not exists:

select x.CITY 
from TBL_X x
where not exists (select 1
                  from tbl_y y
                  where y.CITY = x.CITY 
                 );

Ваши запросы не эквивалентны,точно так же, как это не противоположности:

where x = y
where not (x = y)

В обоих этих пунктах отфильтровываются NULL значения.

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