Subconsultas, EXISTS y NOT EXISTS: utilizar resultados relacionados
Una consulta puede necesitar la respuesta de otra: saber si un cliente tiene pedidos, comparar un precio con el promedio o recuperar un valor calculado para la fila actual.
Una subconsulta es una consulta escrita dentro de otra instrucción. EXISTS y NOT EXISTS se especializan en responder si la consulta interna encuentra al menos una fila.
La idea
La subconsulta puede devolver:
- un solo valor, utilizado dentro de una expresión;
- una lista, utilizada por operadores como
IN; - un conjunto cuya mera existencia se comprueba con
EXISTS.
Una subconsulta correlacionada utiliza columnas de la consulta exterior y se evalúa lógicamente para cada fila de ese conjunto.
Ejemplo: clientes que tienen pedidos
SELECT
c.IdCliente,
c.Nombre
FROM dbo.Cliente AS c
WHERE EXISTS
(
SELECT 1
FROM dbo.Pedido AS p
WHERE p.IdCliente = c.IdCliente
)
ORDER BY c.Nombre;
EXISTS no necesita devolver columnas concretas. SELECT 1 expresa que solo nos interesa comprobar si existe alguna fila relacionada.
Encontrar clientes sin pedidos
SELECT
c.IdCliente,
c.Nombre
FROM dbo.Cliente AS c
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Pedido AS p
WHERE p.IdCliente = c.IdCliente
)
ORDER BY c.Nombre;
| IdCliente | Nombre |
|---|---|
| 3 | Carla Ruiz |
NOT EXISTS suele expresar con claridad una búsqueda de ausencias y no tiene el problema que puede aparecer con NOT IN cuando la lista interna contiene NULL.
Utilizar una subconsulta escalar
Una subconsulta que devuelve exactamente un valor puede formar parte de una expresión:
SELECT
p.IdProducto,
p.Nombre,
p.Precio
FROM dbo.Producto AS p
WHERE p.Precio >
(
SELECT AVG(Precio)
FROM dbo.Producto
WHERE Activo = 1
);
Si la subconsulta escalar devuelve más de una fila, SQL Server genera un error. Una agregación como AVG garantiza aquí un único resultado.
Subconsulta o JOIN
No existe una sustitución automática. EXISTS comunica una prueba de existencia y no multiplica las filas exteriores por cada coincidencia interna. Un JOIN resulta apropiado cuando necesitamos columnas de ambos lados, pero puede duplicar una fila exterior cuando existen varias relaciones.
El optimizador puede transformar expresiones diferentes en planes similares. Elegimos primero la forma que represente correctamente la intención y después medimos si el rendimiento requiere atención.
Qué conviene comprobar
En una subconsulta correlacionada debemos identificar claramente qué columna pertenece al conjunto exterior. Los alias evitan referencias ambiguas y errores donde una condición termina comparando una columna consigo misma.
También revisamos la nulabilidad cuando utilizamos IN y NOT IN, así como la cardinalidad cuando esperamos un solo valor.
Relacionado con
JOIN: recupera columnas de conjuntos relacionados.IN: compara un valor contra una lista o subconsulta.- CTE: puede nombrar una consulta intermedia para facilitar su lectura.
- Agregaciones: producen valores escalares como totales o promedios.