Подзапросы

Область применения:Azure Synapse Analytics Analytics Platform System (PDW)SQL analyticsв хранилище Microsoft Fabric в Microsoft Fabric

В этом разделе приведены примеры использования вложенных запросов в Azure Synapse Analytics, системы платформы аналитики (PDW) или Microsoft Fabric.

Сведения об инструкции SELECT см. в статье SELECT (Transact-SQL).

Содержимое

Основные сведения

Вложенный запрос
Вложенным запросом называется запрос, помещаемый в инструкцию SELECT, INSERT, UPDATE или DELETE или в другой вложенный запрос. Он также называется внутренним запросом или внутренней выборкой.

Внешний запрос
Инструкция, содержащая вложенный запрос. Также называется внешней выборкой.

Связанный вложенный запрос
Вложенный запрос, который обращается к таблице во внешнем запросе.

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

В этом разделе приведены примеры вложенных запросов, поддерживаемых в Azure Synapse Analytics или Analytics Platform System (PDW).

А. TOP и ORDER BY во вложенном запросе

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

B. Предложение HAVING со связанным вложенным запросом

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. Связанные вложенные запросы с аналитикой

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

D. Связанные инструкции объединения во вложенном запросе

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

Д. Предикаты соединения во вложенном запросе

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

F. Связанные предикаты соединения во вложенном запросе

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

G. Связанные вложенные выборки в качестве источников данных

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

H. Связанные вложенные запросы в значениях данных, используемые с агрегатами

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

I. Использование IN со связанным вложенным запросом

В следующем примере в коррелированном или повторяющемся вложенном запросе используется кодовое слово IN. Это запрос, зависящий от результатов выполнения другого запроса. Внутренний запрос повторно выполняется для каждой строки, которая может быть выбрана с помощью внешнего запроса. Этот запрос получает один экземпляр EmployeeKey, а также имя и фамилию каждого сотрудника, для которого значение OrderQuantity в таблице FactResellerSales составляет 5, а соответствующие идентификационные номера в таблицах DimEmployee и 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. Использование EXISTS или IN с вложенным запросом

В приведенном ниже примере представлены семантически эквивалентные запросы для демонстрации различий в использовании ключевых слов EXISTS и IN. Вложенный запрос в каждом из примеров получает один экземпляр каждого названия продукта, подкатегория которого — Road Bikes. Значения ProductSubcategoryKey совпадают в таблицах DimProduct и 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;  

Or

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

K. Использование нескольких связанных вложенных запросов

В данном примере с помощью двух коррелированных запросов осуществляется поиск сотрудников, продавших определенную продукцию.

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;