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;