Compartir a través de


Subconsultas con EXISTS

Cuando una subconsulta se especifica con la palabra clave EXISTS, funciona como una prueba de existencia. La cláusula WHERE de la consulta externa comprueba si existen las filas devueltas por la subconsulta. En realidad, la subconsulta no produce ningún dato, devuelve el valor TRUE o FALSE.

Una subconsulta que se especifica con EXISTS tiene la sintaxis siguiente:

WHERE [NOT] EXISTS (subquery)

La consulta siguiente busca los nombres de todos los productos presentes en la subcategoría Wheels:

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE EXISTS
    (SELECT * 
     FROM Production.ProductSubcategory
     WHERE ProductSubcategoryID = 
            Production.Product.ProductSubcategoryID
        AND Name = 'Wheels')

El conjunto de resultados es el siguiente.

Name
--------------------------------------------------
LL Mountain Front Wheel
ML Mountain Front Wheel
HL Mountain Front Wheel
LL Road Front Wheel
ML Road Front Wheel
HL Road Front Wheel
Touring Front Wheel
LL Mountain Rear Wheel
ML Mountain Rear Wheel
HL Mountain Rear Wheel
LL Road Rear Wheel
ML Road Rear Wheel
HL Road Rear Wheel
Touring Rear Wheel

(14 row(s) affected)

Para comprender el resultado de esta consulta, considere el nombre de cada producto de uno en uno. ¿Este valor hace que la subconsulta devuelva como mínimo una fila? En otras palabras, ¿la consulta hace que la prueba de existencia se evalúe como TRUE?

Observe que las subconsultas que se especifican con EXISTS son ligeramente distintas de las demás subconsultas en los aspectos siguientes:

  • La palabra clave EXISTS no viene precedida de un nombre de columna, constante u otra expresión.

  • La lista de selección de una subconsulta que se especifica con EXISTS casi siempre consta de un asterisco (*). No hay razón para enumerar los nombres de las columnas porque simplemente se está comprobando la existencia de filas que cumplan las condiciones especificadas en la subconsulta.

La palabra clave EXISTS es importante, porque a menudo no hay una formulación alternativa sin subconsultas. Aunque algunas consultas creadas con EXISTS no se pueden expresar de otra forma, muchas consultas pueden usar IN o un operador de comparación modificado por ANY o ALL para lograr resultados similares.

Por ejemplo, la consulta anterior se puede expresar con IN:

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
    (SELECT ProductSubcategoryID
     FROM Production.ProductSubcategory
     WHERE Name = 'Wheels')