2011-10-03 11 views
19

me encontré con un SQL ficticia, no estoy seguro de lo que se piensa la original, que parece:¿Por qué hay un SELECCIONAR 1 en la tabla?

SELECT COUNT (*) 
INTO miss 
FROM billing b 
WHERE b.network= network1 
and NOT EXISTS (SELECT 1 from vas NV WHERE NV.network = 
b.network); 

¿Por qué hay un selecto 1, y no existe?

Respuesta

20

Al usar la palabra clave EXISTS debe tener una declaración de selección secundaria, y solo se verifica la existencia de una fila, los contenidos de la fila no importan. SELECT es una palabra clave que controla lo que está dentro de las columnas que se devuelven. SELECT ing 1 o NV.network devolverá el mismo número de filas.

Por lo tanto, puede SELECCIONAR lo que desee, y las formas canónicas de hacerlo incluyen SELECT NULL o SELECT 1.

Tenga en cuenta que una alternativa a la consulta es:

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 

(unirse izquierdo se llena columnas de la derecha con NULL valores cuando la condición ON no puede ser igualada

+1

Gracias. la consulta alternativa a la que hizo referencia dio como resultado una mayor cardinalidad :( –

+0

@Chin Boon: es 'network1' null? – Benoit

+0

sí, no creo que esta consulta alternativa sea realmente la misma – Magne

11
SELECT 1 from vas NV WHERE NV.network = b.network 

Si esta consulta devuelve. una fila, significa que hay un registro en la tabla NV que coincide con uno en la tabla de facturación.

NO EXISTE lo niega, sati sfying there WHERE cláusula si NO hay un registro en la tabla NV que coincida con uno en la tabla de facturación.

6

Hay una gran AskTom Q & A en el uso de EXISTE vs IN (o NO EXISTE vs NO EN):

http://asktom.oracle.com/pls/asktom/f?p=100:11:1371782877074057::::P11_QUESTION_ID:953229842074

usando Básicamente existe sólo comprueba la existencia de la fila de la subseleccionar y no comprueba cada fila coincidente (que IN). Por lo tanto, al usar EXISTS o NOT EXISTS no necesita seleccionar un valor en particular, por lo que es suficiente seleccionar un marcador de posición (en este caso, "1").

En su instrucción de SQL particular, la cláusula NOT EXISTS asegura que el SELECT principal solo devolverá las filas donde no haya una fila correspondiente en la tabla del VAS.

2

Este código es tuya para escrita principalmente desde un punto de rendimiento

estoy mencionando sólo alrededor de la consulta interna. Dado que necesitaba una explicación para el usuario. Lo que alguna vez sql he utilizado debe ser insertado al usuario consulta real ha utilizado anteriormente

and NOT EXISTS (SELECT 1 from vas NV WHERE NV.network = 
b.network); 

Explicando la consulta interna única Por lo general, la gente utiliza para poner select NV.netword pero esto devuelven un dato que simplemente se utiliza para identificar si no existe una información Entonces, lo ideal es que lo que se devuelve en la consulta interna ni siquiera esté marcado en la consulta principal. Entonces, para reducir Bytes en el plan de explicación, usamos select 1, que tendrá un costo mínimo de bytes y que, a su vez, reducirá el costo de la consulta.

Para ver la diferencia sugiero bajarse Oracle Developer SQL y en funcionamiento tanto la consulta en explicar ventana plan y atento a la columna de bytes para cada consulta

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 

mientras

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. 
No

existe podrás verificar con otras respuestas.

+2

Pruébela con 1/0 en EXISTS. Todavía debería funcionar. No se pueden devolver bytes porque esta es una condición de error: pero en realidad no se evalúa en EXISTS. Por lo tanto, esta respuesta es errónea y engañosa – gbn

+0

@gbn este ejemplo de código es la consulta inicial del usuario que se menciona en la pregunta. He mencionado solo la consulta interna ya que su pregunta solo se refería a la consulta interna. –

Cuestiones relacionadas