powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Непонятка с подчиненным запросом
9 сообщений из 9, страница 1 из 1
Непонятка с подчиненным запросом
    #36569091
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Совершенно непонятная для меня ситуация. Помогите разобраться.
Пишу запрос

select * from
DB2INST.sth_payment p
where
p.PAY_ID = 55414867984

Получаю результат - одна строка. Все правильно...


select * from
DB2INST.sth_payment p
where
p.PARENT_PAY_ID = 55414867984

Получаю результат - пусто. Все логично...


select * from
DB2INST.sth_payment p
where
p.PAY_ID not in (select p1.PARENT_PAY_ID from DB2INST.sth_payment p1)

Получаю результат - пусто. А почему, собственно пусто? Должны вернуться все записи, для которых нет детей.

Путем гаданий на кофейной гуще получен работающий результат

select * from
DB2INST.sth_payment p
where
p.PAY_ID not in (select p1.PARENT_PAY_ID from DB2INST.sth_payment p1 where p1.PARENT_PAY_ID=p.PAY_ID)

С моей точки зрения полностью эквивалентный предыдущему - только список детей сужен до 1-го экземпляра.
...
Рейтинг: 0 / 0
Непонятка с подчиненным запросом
    #36569696
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
(select p1.PARENT_PAY_ID from DB2INST.sth_payment p1
Там null-ов случайно нет?
...
Рейтинг: 0 / 0
Непонятка с подчиненным запросом
    #36571340
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Процентов 60% - поля с пустыми значениями
...
Рейтинг: 0 / 0
Непонятка с подчиненным запросом
    #36571460
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dizzy1984Процентов 60% - поля с пустыми значениямиЧто же вы хотите тогда, там достаточно 1-й такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
with t(id, pid) as (values
  ( 1 ,  0 )
, ( 2 ,  0 )
--, (3, null)
)
select *
from t
where id not in (select pid from t)
почувствуйте разницу с закомментированной строчкой и без неё.
...
Рейтинг: 0 / 0
Непонятка с подчиненным запросом
    #36571704
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понимаю ситуацию, запрос

select pid from t

должен вернуть (0, 0, null), после чего проверить входит ли 1 (а затем последовательно 2 и 3 )в множество (0, 0, null) что будет неверно, а значит отрицание (not) будет верно и результатом должны быть все строки таблицы.(извините, доступа к серверу сейчас нет, проверить не могу).
Видимо, тут есть момент, которого я не пойму. Не разъясните?
...
Рейтинг: 0 / 0
Непонятка с подчиненным запросом
    #36571770
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда null'а нет, мы получаем ответ "да"/"нет", и отрицание этого not ("да"/"нет") = ("нет"/"да").
Когда null есть, мы получаем ответ "да"/"неизвестно", и отрицание этого not ("да"/"неизвестно") = ("нет"/"неизвестно").
...
Рейтинг: 0 / 0
Непонятка с подчиненным запросом
    #36571775
dizzy1984
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно!
...
Рейтинг: 0 / 0
Непонятка с подчиненным запросом
    #36572142
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подведу итоги.

Это психологическая ловушка, в которую, я подозреваю, попадала куча народа (причём многие понаделанные ими баги могут быть не выявлены и могут сработать когда-нибудь позже).

Кажется, что между
1 in (2,3)
и
1 in (2,3,null)
нет разницы, поскольку 1 нет в обоих списках. На самом деле null срабатывает, как ложка супердёгтя, портя бочку любой (!) величины. Ибо in эквивалентен набору or, и

1 in (2,3) = (1=2) or (1=3) = false or false = false
1 in (2,3,null) = (1=2) or (1=3) or (1=null) = false or false or unknown = unknown

В запросах наподобие where 1 in (2,3,null), мы эту разницу не замечаем, но вот когда условие переписывается наподобие where not (1 in (2,3,null)), вдруг случается "неожиданность".
...
Рейтинг: 0 / 0
Непонятка с подчиненным запросом
    #36573439
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dizzy1984Насколько я понимаю ситуацию, запрос

select pid from t

должен вернуть (0, 0, null), после чего проверить входит ли 1 (а затем последовательно 2 и 3 )в множество (0, 0, null) что будет неверно, а значит отрицание (not) будет верно и результатом должны быть все строки таблицы.(извините, доступа к серверу сейчас нет, проверить не могу).
Видимо, тут есть момент, которого я не пойму. Не разъясните?официальное разъяснение: IN predicate .
Поскольку:
Код: plaintext
1.
2.
3.
An IN predicate of the form:
   expression NOT IN (fullselect)
is equivalent to a quantified predicate of the form:
   expression <> ALL (fullselect)
то читаем про Quantified predicate ALL.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Непонятка с подчиненным запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]