Bagikan melalui


Subkueri

Berlaku untuk: Titik akhir analitik SQL Azure Synapse Analytics Platform System (PDW) di Microsoft Fabric Warehouse di Microsoft Fabric

Topik ini memberikan contoh penggunaan subkueri di Azure Synapse Analytics, Analytics Platform System (PDW), atau Microsoft Fabric Warehouse.

Untuk pernyataan SELECT, lihat SELECT (Transact-SQL)

Konten

Dasar

Kueri bertumpuk
Subkueri adalah kueri yang ditumpuk di dalam pernyataan SELECT, INSERT, UPDATE, atau DELETE, atau di dalam subkueri lain. Ini juga disebut kueri dalam atau pemilih dalam.

Kueri luar
Pernyataan yang berisi subkueri. Ini juga disebut pilihan luar.

Subkueri berkorelasi
Subkueri yang merujuk ke tabel di kueri luar.

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

Bagian ini menyediakan contoh subkueri yang didukung di Azure Synapse Analytics atau Analytics Platform System (PDW).

J. TOP dan ORDER BY dalam subkueri

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

B. Klausa HAVING dengan subkueri berkorelasi

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. Subkueri berkorelasi dengan analitik

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

D. Pernyataan serikat berkorelasi dalam subkueri

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

E. Menggabungkan predikat dalam subkueri

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

F. Predikat gabungan yang berkorelasi dalam subkueri

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

G. Subpilih berkorelasi sebagai sumber data

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

H. Subkueri berkorelasi dalam nilai data yang digunakan dengan agregat

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

I. Menggunakan IN dengan subkueri berkorelasi

Contoh berikut menggunakan IN dalam subkueri yang berkorelasi, atau berulang. Ini adalah kueri yang bergantung pada kueri luar untuk nilainya. Kueri dalam dijalankan berulang kali, satu kali untuk setiap baris yang mungkin dipilih oleh kueri luar. Kueri ini mengambil satu instans EmployeeKey plus nama depan dan belakang setiap karyawan di mana OrderQuantity dalam FactResellerSales tabel adalah 5 dan di mana nomor identifikasi karyawan cocok dalam DimEmployee tabel dan 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. Menggunakan EXISTS versus IN dengan subkueri

Contoh berikut menunjukkan kueri yang setara secara semantik untuk menggambarkan perbedaan antara menggunakan EXISTS kata kunci dan IN kata kunci. Keduanya adalah contoh subkueri yang mengambil satu instans dari setiap nama produk yang subkataan produknya adalah Road Bikes. ProductSubcategoryKey kecocokan DimProduct antara tabel dan 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;  

Atau

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

K. Menggunakan beberapa subkueri berkorelasi

Contoh ini menggunakan dua subkueri yang berkorelasi untuk menemukan nama karyawan yang telah menjual produk tertentu.

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;