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;
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de