Subconsultas com EXISTS

Quando uma subconsulta é apresentada com a palavra-chave EXISTS, a subconsulta funciona como um teste de existência. A cláusula WHERE da consulta externa testa se as linhas retornadas pela subconsulta existem. A subconsulta não produz de fato nenhum dado; ela retorna um valor TRUE ou FALSE.

Uma subconsulta apresentada com EXISTS tem a seguinte sintaxe:

WHERE [NOT] EXISTS (subquery)

A consulta a seguir encontra os nomes de todos os produtos que estão na subcategoria Wheels:

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

Aqui está o conjunto de resultados.

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 entender os resultados desta consulta, considere o nome de cada produto individualmente. Esse valor faz a subconsulta retornar pelo menos uma linha? Em outras palavras, a consulta faz com que o teste de existência seja avaliado como TRUE?

Observe que subconsultas apresentadas com EXISTS são um pouco diferentes de outras subconsultas da seguinte forma:

  • A palavra-chave EXISTS não é precedida por um nome de coluna, constante ou outra expressão.

  • A lista seleta de uma subconsulta apresentada por EXISTS quase sempre consiste em um asterisco (*). Não há nenhuma razão para listar nomes de coluna porque você está apenas testando se existem linhas que satisfazem as condições especificadas na subconsulta.

A palavra-chave EXISTS é importante porque geralmente não há formulação alternativa sem subconsultas. Embora algumas consultas que são criadas com EXISTS não possam ser expressadas de nenhum outro modo, muitas consultas podem usar IN ou um operador de comparação modificado por ANY ou ALL para alcançar resultados semelhantes.

Por exemplo, a consulta precedente pode ser expressada usando IN:

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