Siempre que necesito verificar la existencia de alguna fila en una tabla, tiendo a escribir siempre una condición como:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT * -- This is what I normally write
FROM another_table
WHERE another_table.b = a_table.b
)
Algunas otras personas lo escriben como:
SELECT a, b, c
FROM a_table
WHERE EXISTS
(SELECT 1 --- This nice '1' is what I have seen other people use
FROM another_table
WHERE another_table.b = a_table.b
)
Cuando la condición es en NOT EXISTS
lugar de EXISTS
: En algunas ocasiones, podría escribirlo con una LEFT JOIN
y una condición adicional (a veces llamada antiunión ):
SELECT a, b, c
FROM a_table
LEFT JOIN another_table ON another_table.b = a_table.b
WHERE another_table.primary_key IS NULL
Intento evitarlo porque creo que el significado es menos claro, especialmente cuando lo que es tuyo primary_key
no es tan obvio, o cuando tu clave principal o tu condición de unión es de varias columnas (y puedes olvidar fácilmente una de las columnas). Sin embargo, a veces mantienes el código escrito por otra persona ... y está ahí.
¿Hay alguna diferencia (aparte del estilo) para usar en
SELECT 1
lugar deSELECT *
?
¿Hay algún caso de esquina donde no se comporta de la misma manera?Aunque lo que escribí es SQL estándar (AFAIK): ¿Hay tanta diferencia para diferentes bases de datos / versiones anteriores?
¿Hay alguna ventaja en la explicidad de escribir un antijoin?
¿Los planificadores / optimizadores contemporáneos lo tratan de manera diferente a laNOT EXISTS
cláusula?
EXISTS (SELECT FROM ...)
.