Partilhar via


Subconsultas

Aplica-se a:Azure Synapse Analytics AnalyticsPlatform System (PDW)Ponto Final do SQL no Microsoft FabricWarehouse no Microsoft Fabric

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

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

Conteúdos

Noções básicas

Subconsulta
Uma subconsulta é uma consulta aninhada dentro de uma instrução SELECT, INSERT, UPDATE ou DELETE ou dentro de outra subconsulta. Isto também é denominado consulta interna ou seleção interna.

Consulta externa
A instrução que contém a subconsulta. Esta opção também é denominada seleção externa.

Subconsulta correlacionada
Uma subconsulta que se refere a uma tabela na consulta externa.

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

Esta secção fornece exemplos de subconsultas suportadas no Azure Synapse Analytics ou no Analytics Platform System (PDW).

A. TOP e ORDER BY numa subconsulta

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

B. 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 sindicais correlacionadas numa subconsulta

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

E. Associar predicados numa subconsulta

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

F. Predicados de associação correlacionados numa 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 origens 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 utilizados com agregações

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

I. Utilizar o IN com uma subconsulta correlacionada

O exemplo seguinte utiliza IN uma subconsulta correlacionada ou repetida. Esta é uma consulta que depende da consulta externa para os respetivos valores. A consulta interna é executada repetidamente, uma vez para cada linha que pode ser selecionada pela consulta externa. Esta consulta obtém uma instância do nome próprio e apelido de EmployeeKey cada colaborador para o qual o OrderQuantity na FactResellerSales tabela é 5 e para o qual os números de identificação dos funcionários correspondem nas DimEmployee tabelas 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. Utilizar EXISTS versus IN com uma subconsulta

O exemplo seguinte mostra consultas que são semanticamente equivalentes para ilustrar a diferença entre a utilização da EXISTS palavra-chave e a IN palavra-chave. Ambos são exemplos de uma subconsulta que obtém uma instância de cada nome de produto para a qual a subcategoria do produto é Road Bikes. ProductSubcategoryKey corresponde entre as DimProduct tabelas 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. Utilizar várias subconsultas correlacionadas

Este exemplo utiliza duas subconsultas correlacionadas para encontrar os nomes dos colaboradores 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;