MaxCompute, sorgu sonuç kümelerini birleştirmek için dört küme işlecini destekler: INTERSECT, UNION, EXCEPT ve MINUS. Her işlecin, yinelenen satırları işleme biçimine göre iki varyantı bulunur.
Genel Bakış
|
|
|
|
|
|
|
|
|
|
|
|
EXCEPT ve MINUS eş anlamlıdır; aynı sonuçları üretir.
Yinelenen değerlerin işlenmesi: Küme semantiği ve çoklu küme (bag) semantiği
Tüm küme işleçleri aşağıdaki iki moddan birinde çalışır:
Küme semantiği (varsayılan): Sonuçtan yinelenen satırları kaldırır;
DISTINCTuygulamaya eşdeğerdir.ALLanahtar sözcüğünü kullanmadanINTERSECT,UNIONveyaEXCEPTkullanın.Çoklu küme (bag) semantiği: Yinelenen satırları korur.
INTERSECT ALL,UNION ALLveyaEXCEPT ALLkullanın.
Özetle: ALL belirtildiğinde yinelenenler korunur; ALL belirtilmediğinde yinelenenler kaldırılır.
Sınırlamalar
Tek bir ifadede en fazla 256 veri kümesi birleştirilebilir. Bu sınırın aşılması hataya neden olur.
Her iki veri kümesinin sütun sayısı aynı olmalıdır.
Kullanım Notları
Bir
ORDER BYyan tümcesi eklemedikçe sonuçların belirli bir sırada olması garanti edilmez.İlgili sütunlar uyumsuz veri türlerine sahipse MaxCompute, işlemi çalıştırmadan önce örtük tür dönüştürme uygular. Dönüştürme kuralları için Veri türleri konusuna bakın.
Tüm küme işlemlerinde
STRINGile diğer türler arasındaki örtük tür dönüştürme devre dışı bırakılmıştır.STRINGtürünü dize olmayan türlerle birleştirirken sütunları açıkça dönüştürün.
INTERSECT
Her iki veri kümesinde de görünen satırları döndürür.
Sözdizimi
-- Keep duplicate rows in the result.
<select_statement1> INTERSECT ALL <select_statement2>;
-- Remove duplicate rows from the result. INTERSECT and INTERSECT DISTINCT are equivalent.
<select_statement1> INTERSECT [DISTINCT] <select_statement2>;
Parametreler
|
|
|
|
|
|
|
|
|
|
|
|
Örnekler
Örnek 1: Yinelenen satırları koruyarak kesişimi döndürür.
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 6) t(a, b)
INTERSECT ALL
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 7) t(a, b);
Sonuç:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 2 |
| 3 | 4 |
+------------+------------+
Örnek 2: Yinelenen satırları kaldırarak kesişimi döndürür.
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 6) t(a, b)
INTERSECT DISTINCT
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 7) t(a, b);
-- Equivalent to:
SELECT DISTINCT * FROM
(SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 6) t(a, b)
INTERSECT ALL
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 7) t(a, b)) t;
Sonuç:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 3 | 4 |
+------------+------------+
UNION
Her iki veri kümesindeki tüm satırları birleştirilmiş olarak döndürür.
Sözdizimi
-- Keep duplicate rows in the result.
<select_statement1> UNION ALL <select_statement2>;
-- Remove duplicate rows from the result.
<select_statement1> UNION [DISTINCT] <select_statement2>;
Parametreler
|
|
|
|
|
|
|
|
|
|
|
|
Kullanım notları
Birden fazla
UNION ALLişlemini zincirleme kullanırken değerlendirme sırasını belirtmek için parantezlerden yararlanın.-
UNIONsonrasında gelenCLUSTER BY,DISTRIBUTE BY,SORT BY,ORDER BYveLIMITyan tümcelerinin davranışı,odps.sql.type.system.odps2ayarına bağlıdır:SET odps.sql.type.system.odps2=true;— Yan tümce, tümUNIONişlemlerinin sonuçlarına uygulanır.SET odps.sql.type.system.odps2=false;— Yan tümce yalnızcaUNIONiçindeki sonselect_statementifadesine uygulanır.
Örnekler
Örnek 1: Yinelenen satırları koruyarak birleşimi döndürür.
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
UNION ALL
SELECT * FROM VALUES (1, 2), (1, 4) t(a, b);
Sonuç:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 2 |
| 3 | 4 |
| 1 | 2 |
| 1 | 4 |
+------------+------------+
Örnek 2: Yinelenen satırları kaldırarak birleşimi döndürür.
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
UNION DISTINCT
SELECT * FROM VALUES (1, 2), (1, 4) t(a, b);
-- Equivalent to:
SELECT DISTINCT * FROM (
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
UNION ALL
SELECT * FROM VALUES (1, 2), (1, 4) t(a, b));
Sonuç:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 4 |
| 3 | 4 |
+------------+------------+
Örnek 3: UNION ALL işlemlerinin değerlendirme sırasını kontrol etmek için parantez kullanır.
SELECT * FROM VALUES (1, 2), (1, 2), (5, 6) t(a, b)
UNION ALL
(SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
UNION ALL
SELECT * FROM VALUES (1, 2), (1, 4) t(a, b));
Sonuç:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 2 |
| 5 | 6 |
| 1 | 2 |
| 1 | 2 |
| 3 | 4 |
| 1 | 2 |
| 1 | 4 |
+------------+------------+
Örnek 4: odps.sql.type.system.odps2=true ayarıyla UNION ALL ardından ORDER BY ve LIMIT kullanır. ORDER BY ve LIMIT yan tümceleri birleştirilmiş sonuç kümesine uygulanır.
SET odps.sql.type.system.odps2=true;
SELECT explode(ARRAY(3, 1)) AS (a) UNION ALL SELECT explode(ARRAY(0, 4, 2)) AS (a) ORDER BY a limit 3;
Sonuç:
+------------+
| a |
+------------+
| 0 |
| 1 |
| 2 |
+------------+
Örnek 5: odps.sql.type.system.odps2=false ayarıyla UNION ALL ardından ORDER BY ve LIMIT kullanır. ORDER BY ve LIMIT yan tümceleri birleştirilmiş sonuca değil, yalnızca son SELECT ifadesine uygulanır. Her iki sorgudan da tüm satırlar döndürülür.
SET odps.sql.type.system.odps2=false;
SELECT explode(ARRAY(3, 1)) AS (a) UNION ALL SELECT explode(ARRAY(0, 4, 2)) AS (a) ORDER BY a limit 3;
Sonuç:
+------------+
| a |
+------------+
| 3 |
| 1 |
| 0 |
| 2 |
| 4 |
+------------+
EXCEPT ve MINUS
Sol veri kümesinde bulunan ancak sağ veri kümesinde görünmeyen satırları döndürür. EXCEPT ve MINUS eş anlamlıdır.
Sözdizimi
-- Keep duplicate rows in the result.
<select_statement1> EXCEPT ALL <select_statement2>;
<select_statement1> MINUS ALL <select_statement2>;
-- Remove duplicate rows from the result.
<select_statement1> EXCEPT [DISTINCT] <select_statement2>;
<select_statement1> MINUS [DISTINCT] <select_statement2>;
Parametreler
|
|
|
|
|
|
|
|
|
|
|
|
Örnekler
Örnek 1: Sol veri kümesinde bulunan ancak sağ veri kümesinde bulunmayan satırları, yinelenenleri koruyarak döndürür.
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b)
EXCEPT ALL
SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
-- Equivalent to:
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b)
MINUS ALL
SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
Sonuç:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 2 |
| 3 | 4 |
| 7 | 8 |
+------------+------------+
Örnek 2: Sol veri kümesinde bulunan ancak sağ veri kümesinde bulunmayan satırları, yinelenenleri kaldırarak döndürür.
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b)
EXCEPT DISTINCT
SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
-- Equivalent to:
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b)
MINUS DISTINCT
SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
-- Both are equivalent to:
SELECT DISTINCT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b) except all select * from values (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
Sonuç:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 7 | 8 |
+------------+------------+