Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Непонятка с подчиненным запросом
|
|||
|---|---|---|---|
|
#18+
Совершенно непонятная для меня ситуация. Помогите разобраться. Пишу запрос 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-го экземпляра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2010, 17:26 |
|
||
|
Непонятка с подчиненным запросом
|
|||
|---|---|---|---|
|
#18+
Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2010, 23:34 |
|
||
|
Непонятка с подчиненным запросом
|
|||
|---|---|---|---|
|
#18+
Процентов 60% - поля с пустыми значениями ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2010, 17:05 |
|
||
|
Непонятка с подчиненным запросом
|
|||
|---|---|---|---|
|
#18+
dizzy1984Процентов 60% - поля с пустыми значениямиЧто же вы хотите тогда, там достаточно 1-й такой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2010, 17:42 |
|
||
|
Непонятка с подчиненным запросом
|
|||
|---|---|---|---|
|
#18+
Насколько я понимаю ситуацию, запрос select pid from t должен вернуть (0, 0, null), после чего проверить входит ли 1 (а затем последовательно 2 и 3 )в множество (0, 0, null) что будет неверно, а значит отрицание (not) будет верно и результатом должны быть все строки таблицы.(извините, доступа к серверу сейчас нет, проверить не могу). Видимо, тут есть момент, которого я не пойму. Не разъясните? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2010, 19:31 |
|
||
|
Непонятка с подчиненным запросом
|
|||
|---|---|---|---|
|
#18+
Когда null'а нет, мы получаем ответ "да"/"нет", и отрицание этого not ("да"/"нет") = ("нет"/"да"). Когда null есть, мы получаем ответ "да"/"неизвестно", и отрицание этого not ("да"/"неизвестно") = ("нет"/"неизвестно"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2010, 20:44 |
|
||
|
Непонятка с подчиненным запросом
|
|||
|---|---|---|---|
|
#18+
Понятно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2010, 20:52 |
|
||
|
Непонятка с подчиненным запросом
|
|||
|---|---|---|---|
|
#18+
Подведу итоги. Это психологическая ловушка, в которую, я подозреваю, попадала куча народа (причём многие понаделанные ими баги могут быть не выявлены и могут сработать когда-нибудь позже). Кажется, что между 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)), вдруг случается "неожиданность". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2010, 12:06 |
|
||
|
Непонятка с подчиненным запросом
|
|||
|---|---|---|---|
|
#18+
dizzy1984Насколько я понимаю ситуацию, запрос select pid from t должен вернуть (0, 0, null), после чего проверить входит ли 1 (а затем последовательно 2 и 3 )в множество (0, 0, null) что будет неверно, а значит отрицание (not) будет верно и результатом должны быть все строки таблицы.(извините, доступа к серверу сейчас нет, проверить не могу). Видимо, тут есть момент, которого я не пойму. Не разъясните?официальное разъяснение: IN predicate . Поскольку: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2010, 10:24 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=36571340&tid=1602800]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 138ms |

| 0 / 0 |
