Usar subconsultas escalares ou de valores múltiplos
Uma subconsulta escalar é uma instrução SELECT interna dentro de uma consulta externa, gravada para retornar um único valor. As subconsultas escalares podem ser usadas em qualquer lugar em uma instrução T-SQL externa onde uma expressão de valor único é permitida — como em uma cláusula SELECT, uma cláusula WHERE, uma cláusula HAVING ou até mesmo uma cláusula FROM. Eles também podem ser usados em declarações de modificação de dados, como UPDATE ou DELETE.
Subconsultas de valores múltiplos, como o nome sugere, podem retornar mais de uma linha. No entanto, eles ainda retornam uma única coluna.
Subconsultas escalares
Suponha que você queira recuperar os detalhes do último pedido que foi feito, na suposição de que é aquele com o maior valor SalesOrderID .
Para encontrar o valor mais alto de SalesOrderID , você pode usar a seguinte consulta:
SELECT MAX(SalesOrderID)
FROM Sales.SalesOrderHeader
Essa consulta retorna um único valor que indica o valor mais alto para um OrderID na tabela SalesOrderHeader .
Para obter os detalhes dessa ordem, talvez seja necessário filtrar a tabela SalesOrderDetails com base em qualquer valor retornado pela consulta acima. Você pode realizar essa tarefa aninhando a consulta para recuperar o máximo de SalesOrderID dentro da cláusula WHERE de uma consulta que recupera os detalhes do pedido.
SELECT SalesOrderID, ProductID, OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderID =
(SELECT MAX(SalesOrderID)
FROM Sales.SalesOrderHeader);
Para escrever uma subconsulta escalar, considere as seguintes diretrizes:
- Para indicar uma consulta como uma subconsulta, coloque-a entre parênteses.
- Vários níveis de subconsultas são suportados no Transact-SQL. Neste módulo, consideraremos apenas consultas de dois níveis (uma consulta interna dentro de uma consulta externa), mas há suporte para até 32 níveis.
- Se a subconsulta não retornar linhas (um conjunto vazio), o resultado da subconsulta será um NULL. Se for possível em seu cenário que nenhuma linha seja retornada, você deve garantir que sua consulta externa possa lidar normalmente com um NULL, além de outros resultados esperados.
- A consulta interna geralmente deve retornar uma única coluna. Selecionar várias colunas em uma subconsulta é quase sempre um erro. A única exceção é se a subconsulta for introduzida com a palavra-chave EXISTS.
Uma subconsulta escalar pode ser usada em qualquer lugar em uma consulta onde um valor é esperado, incluindo a lista SELECT. Por exemplo, podemos estender a consulta que recuperou detalhes para o pedido mais recente para incluir a quantidade média de itens que é encomendada, para que possamos comparar a quantidade encomendada na ordem mais recente com a média de todos os pedidos.
SELECT SalesOrderID, ProductID, OrderQty,
(SELECT AVG(OrderQty)
FROM SalesLT.SalesOrderDetail) AS AvgQty
FROM SalesLT.SalesOrderDetail
WHERE SalesOrderID =
(SELECT MAX(SalesOrderID)
FROM SalesLT.SalesOrderHeader);
Subconsultas com vários valores
Uma subconsulta de vários valores é adequada para retornar resultados usando o operador IN. O exemplo hipotético a seguir retorna os valores CustomerID, SalesOrderID para todos os pedidos feitos por clientes no Canadá.
SELECT CustomerID, SalesOrderID
FROM Sales.SalesOrderHeader
WHERE CustomerID IN (
SELECT CustomerID
FROM Sales.Customer
WHERE CountryRegion = 'Canada');
Neste exemplo, se você executasse apenas a consulta interna, uma coluna de valores CustomerID seria retornada, com uma linha para cada cliente no Canadá.
Em muitos casos, subconsultas de vários valores podem ser facilmente escritas usando junções. Por exemplo, aqui está uma consulta que usa uma junção para retornar os mesmos resultados do exemplo anterior:
SELECT c.CustomerID, o.SalesOrderID
FROM Sales.Customer AS c
JOIN Sales.SalesOrderHeader AS o
ON c.CustomerID = o.CustomerID
WHERE c.CountryRegion = 'Canada';
Então, como você decide se deseja escrever uma consulta envolvendo várias tabelas como um JOIN ou com uma subconsulta? Às vezes, depende apenas do que você está mais confortável. A maioria das consultas aninhadas que são facilmente convertidas em JOINs na verdade SERÃO convertidas em uma JOIN internamente. Para tais consultas, não há então nenhuma diferença real em escrever a consulta de uma maneira versus outra.
Uma restrição que você deve ter em mente é que, ao usar uma consulta aninhada, os resultados retornados ao cliente só podem incluir colunas da consulta externa. Portanto, se você precisar retornar colunas de ambas as tabelas, deverá escrever a consulta usando um JOIN.
Finalmente, há situações em que a consulta interna precisa executar operações muito mais complicadas do que as recuperações simples em nossos exemplos. Reescrever subconsultas complexas usando um JOIN pode ser difícil. Muitos desenvolvedores SQL acham que as subconsultas funcionam melhor para processamento complicado porque permite dividir o processamento em etapas menores.