Получение нечетных результатов из моих инструкций SQL

#sql-server #where

#sql-server #where-предложение

Вопрос:

Я получил разные результаты, когда повторил оператор 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 для каждого случая.

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

Комментарии:

1. Все, что вам нужно, это заменить это AND на OR . Одна строка не может иметь два значения для одного и того же столбца (и), но они могут иметь одно ИЛИ другое значение. Кстати, я думаю, что это предложение where должно возвращать нулевые результаты, но похоже, что оно возвращает все строки вашей таблицы, и это странно. Надеюсь, я смогу вам помочь.

2. Никогда не используйте ИЛИ без круглых скобок. SELECT * FROM ErrTbl WHERE status = 'unresolved' AND ErrCd = '635' OR ErrCd = '735' это не то же самое, что SELECT * FROM ErrTbl WHERE status = 'unresolved' AND (ErrCd = '635' OR ErrCd = '735')

Ответ №1:

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

 SELECT * FROM ErrTbl WHERE ErrCd = '635'
  

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

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

Ответ №2:

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

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

 select count(*) from ( original query ) as q
  

Ответ №3:

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

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

Когда я добавил последнюю строку ‘OR ErrCd = ‘635’, OR переопределил первые два условия WHERE (status = ‘неразрешенный’ И ErrCd = ‘635’). Поэтому он вернул 1058 строк, которые были все с кодом ошибки 635, но содержали как разрешенные, так и неразрешенные статусы.

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

Ответ №4:

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

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

Оба ваших условия должны быть истинными

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

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

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