|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Возникла необходимость сравнить список с таблицей, соответственно создал таблицу и загрузил туда список(пусть будет таблица A). Сравниваю с таблицей Б по полю ID. Таблица А - 196 записей. Таблица Б - 210 000 записей. DB2 9.7.9 (windows) Делаю: Код: plsql 1.
получаю 51 запись. Делаю: Код: plsql 1.
и НЕОЖИДАННО, вместо 145 записей получаю 0. А вот если: Код: plsql 1.
то результат верный, 145 записей. Уточню, после создания таблицы А ни сбора статистики, ни чего еще не проводилось(даже db2 не перезапускал). Второй раз с таким сталкиваюсь, оба раза ситуация возникала с новыми(временными) таблицами созданными для оперативного сравнения списков. Подозреваю, что дело в каком-нибудь оптимизаторе запросов, но моих знаний не достаточно для точных выводов. Какие будут идеи? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2015, 21:35 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Guzya, в Б есть ID которые IS NULL... для проверки этого предположения выполни: select * from А where id NOT in (select id from Б where id IS NOT NULL ); и посмотри что будет... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 06:10 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Код: plsql 1.
результат правильный. Но, Код: plsql 1.
пусто. Объясните пожалуйста на пальцах, почему. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 09:27 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Потому что where a=null пусто и where not(a=null or неважно-что) тоже пусто, а in (логически) это вариант or. Кстати, есть момент с null'ами, про который не предостерегают, на него легко не обратить внимание, а он важен: Когда where undefined или where false, нет разницы - выборка пуста. Но для constraint'ов check(undefined) или check(false) ведут себя по-разному, undefined не мешает добавить строку в таблицу. Нет нужды и даже вредно писать вещи вроде check xxx constraint(FIO is null or FIO=upper(FIO)) кода с тем же эффектом можно check xxx constraint(FIO=upper(FIO)) (оптимизатор будет благодарен) "For example, CHECK (salary + bonus > 30000) is accepted if salary is set to NULL, because CHECK constraints must be either satisfied or unknown, and in this case, salary is unknown. However, CHECK (salary IS NOT NULL) would be considered false and a violation of the constraint if salary is set to NULL." ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 12:00 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Спасибо, попробую осмыслить. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 14:59 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Victor MetelitsaПотому что where a=null пусто и where not(a=null or неважно-что) тоже пусто, а in (логически) это вариант or.Виктор, при всем моем уважении, позволь не согласиться с тобой... Точнее, слегка тебя подправить. Вся соль тут в том, что предикат IN эквивалентен OR-у, как ты и сказал, но вот предикат NOT IN эквивалентен AND-у. То есть, Код: sql 1.
по сути будет обрабатываться так: Код: sql 1.
в то время, как Код: sql 1.
будет обрабатываться так: Код: sql 1.
А вот теперь начинает работать SQL-булева алгебра. И тут, всё же (это как раз исправление-дополнения к твоему высказыванию) NULL OR TRUE дает TRUE. В то время как NULL AND TRUE дает NULL, который трактуется, по сути, как FALSE. Именно поэтому IN вернул автору чего-то, а NOT IN - ничего не вернул. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 15:16 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
not (a or b) = (not a) and (not b) Проверка: not (F or F) = not(F) = T not (F or T) = not(T) = F not (T or T) = not(T) = F not (U or U) = not(U) = U not (U or F) = not(U) = U not (U or T) = not(T) = F not (F) and not(F) = T and T = T not (F) and not(T) = T and F = F not (T) and not(T) = F and F = F not (U) and not(U) = U and U = U not (U) and not(F) = U and T = U not (U) and not(T) = U and F = F ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 16:32 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Прошу прощения за глупый вопрос, но подскажите. Если, val1=12 val2=null каким будет результат выражения val1 != val2 , true\false или null? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 17:15 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Запрос: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Ответ: Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 20:54 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Тогда лучше так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 21:18 |
|
DB2, неожиданый результат выборки.
|
|||
---|---|---|---|
#18+
Упс, опечатка. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2015, 21:18 |
|
|
start [/forum/topic.php?fid=43&tid=1600813]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
175ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 237ms |
total: | 510ms |
0 / 0 |