Subconsultas

Aplica-se a:Azure Synapse AnalyticsPDW (Analytics Platform System)Ponto de extremidade de análise do SQL no Microsoft FabricWarehouse no Microsoft Fabric

Este tópico fornece exemplos de uso de subconsultas no Azure Synapse Analytics, no PDW (Analytics Platform System) ou no Microsoft Fabric.

Para a instrução SELECT, confira SELECT (Transact-SQL)

Conteúdo

Noções básicas

Subconsulta
Uma subconsulta é uma consulta aninhada em uma instrução SELECT, INSERT, UPDATE ou DELETE, ou em subconsulta. Ela também é chamada de consulta interna ou seleção interna.

Consulta externa
A instrução que contém a subconsulta. Ela também é chamada de seleção externa.

Subconsulta correlacionada
Uma subconsulta que faz referência a uma tabela na consulta externa.

Exemplos: Azure Synapse Analytics e PDW (Analytics Platform System)

Esta seção fornece exemplos de subconsultas compatíveis com o Azure Synapse Analytics ou o PDW (Analytics Platform System).

a. TOP e ORDER BY em uma subconsulta

SELECT * FROM tblA  
WHERE col1 IN  
    (SELECT TOP 100 col1 FROM tblB ORDER BY col1);

B. A cláusula HAVING com uma subconsulta correlacionada

SELECT dm.EmployeeKey, dm.FirstName, dm.LastName   
FROM DimEmployee AS dm   
GROUP BY dm.EmployeeKey, dm.FirstName, dm.LastName  
HAVING 5000 <=   
(SELECT sum(OrderQuantity)  
FROM FactResellerSales AS frs  
WHERE dm.EmployeeKey = frs.EmployeeKey)  
ORDER BY EmployeeKey;

C. Subconsultas correlacionadas com análise

SELECT * FROM ReplA AS A   
WHERE A.ID IN   
    (SELECT sum(B.ID2) OVER() FROM ReplB AS B WHERE A.ID2 = B.ID);  

D. Instruções de união correlacionadas em uma subconsulta

SELECT * FROM RA   
WHERE EXISTS   
    (SELECT 1 FROM RB WHERE RB.b1 = RA.a1   
     UNION ALL SELECT 1 FROM RC);  

E. Predicados de junção em uma subconsulta

SELECT * FROM RA INNER JOIN RB   
    ON RA.a1 = (SELECT COUNT(*) FROM RC);  

F. Predicados de junção correlacionados em uma subconsulta

SELECT * FROM RA   
    WHERE RA.a2 IN   
    (SELECT 1 FROM RB INNER JOIN RC ON RA.a1=RB.b1+RC.c1);  

G. Subseleções correlacionadas como fontes de dados

SELECT * FROM RA   
    WHERE 3 = (SELECT COUNT(*)   
        FROM (SELECT b1 FROM RB WHERE RB.b1 = RA.a1) X);  

H. Subconsultas correlacionadas nos valores de dados usadas com agregações

SELECT Rb.b1, (SELECT RA.a1 FROM RA WHERE RB.b1 = RA.a1) FROM RB GROUP BY RB.b1;  

I. Usando IN com uma subconsulta correlacionada

O exemplo a seguir usa IN em uma subconsulta correlata ou repetitiva. Trata-se de uma consulta que depende da consulta externa para obter seus valores. A consulta interna é executada repetidamente, uma vez para cada linha que pode ser selecionada pela consulta externa. Essa consulta recupera uma instância de EmployeeKey além do nome e do sobrenome de cada funcionário para o qual a OrderQuantity na FactResellerSales tabela é 5 e para o qual os números de identificação de funcionário correspondem nas tabelas DimEmployee e FactResellerSales.

SELECT DISTINCT dm.EmployeeKey, dm.FirstName, dm.LastName   
FROM DimEmployee AS dm   
WHERE 5 IN   
    (SELECT OrderQuantity  
    FROM FactResellerSales AS frs  
    WHERE dm.EmployeeKey = frs.EmployeeKey)  
ORDER BY EmployeeKey;  

J. Usando EXISTS versus IN com uma subconsulta

O exemplo a seguir mostra consultas semanticamente equivalentes para ilustrar a diferença entre usar a palavra-chave EXISTS e a palavra-chave IN. Ambos são exemplos de uma subconsulta que recupera uma instância de cada nome de produto para o qual a subcategoria de produto é Road Bikes. ProductSubcategoryKey faz a correspondência entre as tabelas DimProduct e DimProductSubcategory.

SELECT DISTINCT EnglishProductName  
FROM DimProduct AS dp   
WHERE EXISTS  
    (SELECT *  
     FROM DimProductSubcategory AS dps   
     WHERE dp.ProductSubcategoryKey = dps.ProductSubcategoryKey  
           AND dps.EnglishProductSubcategoryName = 'Road Bikes')  
ORDER BY EnglishProductName;  

Ou

SELECT DISTINCT EnglishProductName  
FROM DimProduct AS dp   
WHERE dp.ProductSubcategoryKey IN  
    (SELECT ProductSubcategoryKey  
     FROM DimProductSubcategory   
     WHERE EnglishProductSubcategoryName = 'Road Bikes')  
ORDER BY EnglishProductName;  

K. Usando várias subconsultas correlacionadas

Este exemplo usa duas subconsultas correlatas para localizar os nomes de funcionários que venderam um produto específico.

SELECT DISTINCT LastName, FirstName, e.EmployeeKey  
FROM DimEmployee e JOIN FactResellerSales s ON e.EmployeeKey = s.EmployeeKey  
WHERE ProductKey IN  
(SELECT ProductKey FROM DimProduct WHERE ProductSubcategoryKey IN  
(SELECT ProductSubcategoryKey FROM DimProductSubcategory   
 WHERE EnglishProductSubcategoryName LIKE '%Bikes'))  
ORDER BY LastName;