Sous-requêtes
S’applique à :Azure Synapse AnalyticsAnalytics Platform System (PDW)Point de terminaison analytique SQL dans Microsoft FabricWarehouse dans Microsoft Fabric
Cette rubrique fournit des exemples d’utilisation des sous-requêtes dans Azure Synapse Analytics, Analytics Platform System (PDW) ou Microsoft Fabric.
Pour l’instruction SELECT, consultez SELECT (Transact-SQL)
Contents
Notions de base
Sous-requête
Une sous-requête est une requête qui est imbriquée dans une instruction SELECT, INSERT, UPDATE ou DELETE, ou dans une autre sous-requête. Elle est également désignée sous le nom de requête interne ou sélection interne.
Requête externe
Instruction contenant la sous-requête. Elle est également appelée sélection externe.
Sous-requête corrélée
Sous-requête qui fait référence à une table dans la requête externe.
Exemples : Azure Synapse Analytics et Analytics Platform System (PDW)
Cette section fournit des exemples de sous-requêtes prises en charge dans Azure Synapse Analytics ou Analytics Platform System (PDW).
R. TOP et ORDER BY dans une sous-requête
SELECT * FROM tblA
WHERE col1 IN
(SELECT TOP 100 col1 FROM tblB ORDER BY col1);
B. Clause HAVING avec une sous-requête corrélée
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. Sous-requêtes corrélées avec analytique
SELECT * FROM ReplA AS A
WHERE A.ID IN
(SELECT sum(B.ID2) OVER() FROM ReplB AS B WHERE A.ID2 = B.ID);
D. Instructions d’union corrélées dans une sous-requête
SELECT * FROM RA
WHERE EXISTS
(SELECT 1 FROM RB WHERE RB.b1 = RA.a1
UNION ALL SELECT 1 FROM RC);
E. Prédicats de jointure dans une sous-requête
SELECT * FROM RA INNER JOIN RB
ON RA.a1 = (SELECT COUNT(*) FROM RC);
F. Prédicats de jointure corrélés dans une sous-requête
SELECT * FROM RA
WHERE RA.a2 IN
(SELECT 1 FROM RB INNER JOIN RC ON RA.a1=RB.b1+RC.c1);
G. Sous-sélections corrélées comme sources de données
SELECT * FROM RA
WHERE 3 = (SELECT COUNT(*)
FROM (SELECT b1 FROM RB WHERE RB.b1 = RA.a1) X);
H. Sous-requêtes corrélées dans les valeurs de données utilisées avec des agrégats
SELECT Rb.b1, (SELECT RA.a1 FROM RA WHERE RB.b1 = RA.a1) FROM RB GROUP BY RB.b1;
I. Utilisation du mot clé IN avec une sous-requête corrélée
L'exemple suivant utilise IN
dans une sous-requête en corrélation ou répétitive. Il s'agit d'une requête dont les valeurs dépendent de la requête externe. La requête interne est exécutée de manière répétitive, à raison d’une fois par ligne sélectionnable par la requête externe. Cette requête récupère une instance de EmployeeKey
plus le prénom et le nom de chaque employé pour lequel la valeur OrderQuantity
dans la table FactResellerSales
est égale à 5
et dont le numéro d’identification d’employé figure dans les tables DimEmployee
et 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. Utilisation du mot clé EXISTS ou IN dans une sous-requête
Les exemples suivants montrent des requêtes sémantiquement équivalentes pour illustrer la différence entre l’utilisation du mot clé EXISTS
et celle du mot clé IN
. Ces deux exemples de sous-requête récupèrent une instance de chaque nom de produit pour lequel la sous-catégorie de produit est Road Bikes
. La sous-catégorie ProductSubcategoryKey
figure dans les tables DimProduct
et 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. Utilisation de sous-requêtes corrélées multiples
Cet exemple utilise deux sous-requêtes corrélées pour rechercher les noms des employés ayant vendu un produit spécifique.
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;
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour