Подтвердить что ты не робот

Почему есть таблица 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 и не существует?

4b9b3361

Ответ 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.

Не существует, вы сможете проверить с помощью других ответов.