Получение странных результатов из моих операторов SQL - PullRequest
0 голосов
/ 10 апреля 2019

Я получил разные результаты, когда повторил утверждение WHERE (по ошибке).

Сегодня я пытался посмотреть, сколько раз в нашей системе появлялись ошибки. Я получил странные результаты, когда повторил одно и то же утверждение WHERE по ошибке. Я сначала искал код ошибки 635 и получил 140 возвратов. Поэтому я попытался найти два разных кода ошибки, но неправильно набрал второй рассматриваемый код с тем же номером, что и в первом операторе WHERE, 635, и мне было возвращено 1058 строк.

Мне любопытно, почему 1058 строк не возвращались, когда у меня был только один оператор WHERE. Я даже экспериментировал и повторял инструкцию WHERE еще три раза (всего четыре), но количество возвращаемых строк оставалось постоянным на уровне 1058.

Сначала я запустил это и вернул 140 строк ...

SELECT *
FROM ErrTbl
WHERE status = 'unresolved'
AND ErrCd = '635'

Тогда я хотел запустить это ...

SELECT *
FROM ErrTbl
WHERE status = 'unresolved'
AND ErrCd = '635'
OR ErrCd = '735'

Но я случайно запустил это и вернул 1058 строк ...

SELECT *
FROM ErrTbl
WHERE status = 'unresolved'
AND ErrCd = '635'
OR ErrCd = '635'

Если бы я случайно повторил одно и то же утверждение WHERE, я бы ожидал, что возвращаемые строки будут одинаковыми, в данном случае 140. На самом деле, если посмотреть на возвращаемые значения, это должно было быть 1058 для каждого случая.

Я не уверен, почему разница.

Ответы [ 4 ]

0 голосов
/ 10 апреля 2019

Вы получили разные результаты, потому что вы запустили другой выбор, когда вы выполняете

SELECT *
FROM ErrTbl
WHERE status = 'unresolved'
AND ErrCd = '635'

Оба условия должны иметь значение true

Но когда вы запускаете

SELECT *
FROM ErrTbl
WHERE status = 'unresolved'
AND ErrCd = '635'
Or ErrCd = '635'

Если ErrCd = '635' сбудется, то будет достаточно

0 голосов
/ 10 апреля 2019

Не думайте, что в вашем запросе есть проблема.

Если у вас есть конфликт счетчиков, оберните ваш запрос выбранным счетчиком (*), чтобы получить точный счет. Иногда настройки IDE обрезают выходные данные или изменения базовой таблицы

select count(*) from ( original query ) as q
0 голосов
/ 10 апреля 2019

Так что я понял это.Я упустил, что у меня есть дополнительное утверждение WHERE для статуса.Я не думал, что это важно для этой дискуссии, но я ошибался.Я изменил код в исходном вопросе.

Похоже, что запрос сначала возвратил 140 строк, в которых код ошибки был 635, а статус был не разрешен, как ожидалось.

Когда я добавил последний 'ИЛИ ErrCd = '635' строка, ИЛИ переопределило первые два условия ГДЕ (статус = 'неразрешенный' И ErrCd = '635').Поэтому он возвратил 1058 строк, которые все имели код ошибки 635, но содержали как разрешенные, так и неразрешенные состояния.

Простая публикация и задание вопроса помогли мне обдумать это.

0 голосов
/ 10 апреля 2019

Это зависит от того, как загружается ErrTbl, может случиться так, что таблица загружалась, когда вы впервые запустили следующий запрос и получили 140 строк.

SELECT * FROM ErrTbl WHERE ErrCd = '635'

Далее, когда мы запустили следующий запрос,вы получили 1058 строк, потому что данные могли измениться в таблице после завершения загрузки, и, следовательно, результаты не изменились после этого.

SELECT * FROM ErrTbl WHERE ErrCd = '635' AND ErrCd = '635'
...