#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'
сбудется, будет достаточно