Почему есть таблица SELECT 1 из таблицы?
Я столкнулся с фиктивным SQL, я не уверен, что это за оригинал, он выглядит так:
SELECT COUNT (*)
INTO miss
FROM billing b
WHERE b.network= network1
and NOT EXISTS (SELECT 1 from vas NV WHERE NV.network =
b.network);
Почему есть выбор 1 и не существует?
Ответы
Ответ 1
При использовании ключевого слова EXISTS
у вас должен быть оператор подвыбора, и проверяется только наличие строки, содержимое строки не имеет значения. SELECT
- это ключевое слово, которое контролирует то, что находится внутри возвращаемых столбцов. SELECT
ing 1
или NV.network
вернет одинаковое количество строк.
Поэтому вы можете выбрать все, что хотите, и канонические способы сделать это: SELECT NULL
или SELECT 1
.
Обратите внимание, что альтернатива вашему запросу:
SELECT count(*) INTO miss
FROM billing b
LEFT JOIN vas NV ON NV.network = b.network
WHERE b.network = network1
AND NV.network IS NULL
(левое объединение заполняет правые столбцы значениями NULL
, когда условие ON
невозможно сопоставить.
Ответ 2
SELECT 1 from vas NV WHERE NV.network = b.network
Если этот запрос возвращает строку, это означает, что в таблице NV есть запись, которая соответствует одной в таблице фактурирования.
NOT EXISTS отрицает его, удовлетворяя предложение WHERE, если в таблице NV нет записи, которая соответствует одной в таблице фактурирования.
Ответ 3
Существует большой AskTom Q & A при использовании EXISTS vs IN (или NOT EXISTS vs NOT IN):
http://asktom.oracle.com/pls/asktom/f?p=100:11:1371782877074057::::P11_QUESTION_ID:953229842074
В основном использование EXISTS проверяет наличие строки в подзапросе и не проверяет каждую подходящую строку (которая будет IN). Поэтому при использовании EXISTS или NOT EXISTS вам не нужно фактически выбирать конкретное значение, поэтому достаточно выбрать placeholder (в данном случае "1" ).
В вашей конкретной инструкции SQL предложение NOT EXISTS гарантирует, что основной SELECT будет возвращать только строки, где в таблице VAS нет соответствующей строки.
Ответ 4
Этот ваш код, в основном, написан с точки зрения производительности
Я упоминаю только о внутреннем запросе. Поскольку для этого нужны объяснения для пользователя. То, что когда-либо было использовано мной, должно быть вставлено в фактический пользователь, который использовал выше
and NOT EXISTS (SELECT 1 from vas NV WHERE NV.network =
b.network);
Объяснение только внутреннего запроса
Обычно люди используют select NV.netword
, но это возвращает данные, которые просто используются для идентификации, если данных не существует. Таким образом, идеально, что когда-либо возвращается во внутренний запрос, даже не проверяется в родительском запросе. Поэтому для сокращения байтов в плане объяснения мы используем select 1
, который будет иметь минимальную байтовую стоимость и которая в свою очередь уменьшит стоимость запроса.
Чтобы просмотреть разницу, я предлагаю загрузить оракул sql developer и запустить оба запроса в окне плана объяснения и следить за столбцами байтов для каждого запроса
SELECT nv.network from vas NV WHERE NV.network = b.network
// cost will be depended on the value nv.network contain and that is selected in the where condition
while
SELECT 1 from vas NV WHERE NV.network = b.network
// cost will be independent of the column and cost lesser bytes selected and lesser cost.
Не существует, вы сможете проверить с помощью других ответов.