Set Operatörlerini Kullanma

Set operatörleri iki (veya daha fazla) SELECT ifadesinin sonuçlarını birleştirmek için kullanılır. Oracle 11g'de bulunan SET operatörleri UNION, UNION ALL, INTERSECT ve MINUS'tur.

UNION set operatörü, iki SELECT ifadesinin birleşik sonuçlarını döndürür.Genel olarak, sonuçlardan kopyaları kaldırır, yani her kopya sonuç için yalnızca bir satır listelenir.Bu davranışa karşı, kopyaları tutan UNION ALL set operatörünü kullanın. final result.INTERSECT yalnızca her iki SELECT sorgusunda ortak olan kayıtları listeler; MINUS set operatörü, birinci sorgunun sonuçlarında da bulunuyorsa, ikinci sorgunun sonuçlarını çıktıdan kaldırır. INTERSECT ve MINUS set işlemleri tekilleştirilmemiş sonuçlar üretir.

Tüm SET operatörleri, aralarında aynı derecede önceliği paylaşır. Bunun yerine, sorgu yürütme sırasında Oracle, soldan sağa veya yukarıdan aşağıya değerlendirmeye başlar. sarkan operatörler.

Hatırlanacak noktalar -

  • Katılan tüm SELECT deyimleri tarafından aynı sayıda sütun seçilmelidir. Ekranda kullanılan sütun adları ilk sorgudan alınır.

  • Sütun listesinin veri türleri uyumlu / örtük olarak oracle tarafından dönüştürülebilir olmalıdır. Bileşen sorgularındaki karşılık gelen sütunlar farklı veri türü gruplarına aitse Oracle örtük tür dönüşümü gerçekleştirmez.Örneğin, birinci bileşen sorgusundaki bir sütun DATE veri türündeyse ve ikinci bileşen sorgusundaki ilgili sütun verilerdeyse CHAR türü, Oracle örtük dönüştürme gerçekleştirmeyecek, ancak ORA-01790 hatasını artıracaktır.

  • Sonuç kümesini sıralamak için konumsal sıralama kullanılmalıdır. Set operatörleri ile bireysel sonuç seti sıralamasına izin verilmez. ORDER BY, sorgunun sonunda bir kez görünebilir. Örneğin,

  • UNION ve INTERSECT operatörleri değişmeli, yani sorguların sırası önemli değildir; nihai sonucu değiştirmez.

  • Performans açısından UNION ALL, UNION ile karşılaştırıldığında daha iyi performans gösterir çünkü kaynaklar, kopyaları filtrelemek ve sonuç kümesini sıralamak için boşa harcanmaz.

  • Set operatörleri, alt sorguların bir parçası olabilir.

  • Set operatörleri, TABLE koleksiyonu ifadeleri içeren SELECT ifadelerinde kullanılamaz.

  • LONG, BLOB, CLOB, BFILE, VARRAY veya iç içe tablonun Set işleçlerinde kullanılmasına izin verilmez. Küme işleçlerinde güncelleme için yan tümcesine izin verilmez.

BİRLİK

UNION operatörü kullanılarak birden çok SELECT sorgusu birleştirildiğinde, Oracle, NULL değerlerini göz ardı etmeden, tüm yinelenenleri kaldırdıktan sonra ve sıralı sırada (varsayılan olarak artan) tüm bileşik SELECT sorgularından birleşik sonucu görüntüler.

UNION operatörü kullanılarak birleştirilen aşağıdaki beş sorguyu düşünün: Nihai birleşik sonuç kümesi, tüm SQL'lerden gelen değerleri içerir. Verilerin çoğaltılmasının kaldırılmasına ve sınıflandırılmasına dikkat edin.

SELECT 1 NUM FROM DUAL
UNION
SELECT 5 FROM DUAL 
UNION
SELECT 3 FROM DUAL
UNION
SELECT 6 FROM DUAL
UNION
SELECT 3 FROM DUAL;

NUM
-------
1
3
5
6

Dikkat edilmesi gereken, SELECT sorgularında seçilen sütunların uyumlu veri türünde olması gerekir. Oracle, kural ihlal edildiğinde bir hata mesajı atar.

SELECT TO_DATE('12-OCT-03') FROM DUAL
UNION
SELECT '13-OCT-03' FROM DUAL;

SELECT TO_DATE('12-OCT-03') FROM DUAL
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

BİRLİĞİ TÜMÜ

UNION ve UNION ALL, küçük bir farkla işleyişlerinde benzerdir. Ancak UNION ALL, yinelemeyi kaldırmadan ve verileri sıralamadan sonuç kümesini verir. Örneğin, yukarıdaki sorguda UNION, etkisini görmek için UNION ALL ile değiştirilmiştir.

BİRLİK bölümünde gösterilen sorguyu düşünün. Sıralama ve tekilleştirme olmadan üretilen çıktıdaki farkı not edin.

SELECT 1 NUM FROM DUAL
UNION ALL
SELECT 5 FROM DUAL 
UNION ALL
SELECT 3 FROM DUAL
UNION ALL
SELECT 6 FROM DUAL
UNION ALL
SELECT 3 FROM DUAL;

NUM
-------
1
5
3
6
3

INTERSECT

INTERSECT operatörünü kullanarak Oracle, her iki SELECT deyimindeki ortak satırları, çoğaltmalar olmadan ve sıralı düzende düzenlenmiş verilerle (varsayılan olarak artan) görüntüler.

Örneğin, aşağıdaki SELECT sorgusu departman 10 ve 20'de ortak olan maaşı alır. ISO SQL Standartlarına göre INTERSECT, set operatörlerinin değerlendirilmesinin önceliğinde diğerlerinden üstündür, ancak bu hala Oracle tarafından dahil edilmemiştir.

SELECT SALARY
FROM employees
WHERE DEPARTMENT_ID = 10
INTRESECT
SELECT SALARY 
FROM employees
WHERE DEPARTMENT_ID = 20

SALARY
---------
1500
1200
2000

EKSİ

Eksi operatörü, ilk sorguda bulunan ancak ikinci sorguda bulunmayan satırları, varsayılan olarak artan sırada düzenlenmiş veri ve yineleme olmadan görüntüler.

SELECT JOB_ID
FROM employees
WHERE DEPARTMENT_ID = 10
MINUS
SELECT JOB_ID
FROM employees
WHERE DEPARTMENT_ID = 20;

JOB_ID
-------------        
HR
FIN
ADMIN

SELECT ifadesiyle eşleştirme

Bileşik SELECT ifadelerinin farklı sayılara ve seçilen sütunların veri türüne sahip olabileceği senaryolar olabilir. Bu nedenle, sütun listesini açıkça eşleştirmek için, her SELECT deyimindeki seçili sütunların sayısı ve veri türüyle eşleşecek şekilde NULL sütunlar eksik konumlara eklenir. Sayı sütunları için, sorguda seçilen sütunların türüyle eşleşecek şekilde sıfır da değiştirilebilir.

Aşağıdaki sorguda, çalışan adı (varchar2) ve konum kimliği (numara) veri türü eşleşmiyor. Bu nedenle, aşağıdaki sorgunun yürütülmesi uyumluluk sorunu nedeniyle hataya neden olabilir.

SELECT DEPARTMENT_ID "Dept", first_name "Employee"
FROM employees
UNION
SELECT DEPARTMENT_ID, LOCATION_ID
FROM departments;

ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

Açıkça, sütunlar konum kimliği ve Çalışan adı yerine NULL konularak eşleştirilebilir.

SELECT DEPARTMENT_ID "Dept", first_name "Employee", NULL "Location"
FROM employees
UNION
SELECT DEPARTMENT_ID, NULL "Employee", LOCATION_ID
FROM departments;

SET işlemlerinde ORDER BY yan tümcesini kullanma

ORDER BY yan tümcesi, bileşik SELECT deyimleri içeren sorgunun sonunda yalnızca bir kez görünebilir. Tek tek SELECT deyimlerinin ORDER BY yan tümcesine sahip olamayacağı anlamına gelir. Ek olarak, sıralama yalnızca ilk SELECT sorgusunda görünen sütunlara dayalı olabilir. Bu nedenle, bileşik sorguyu sütun pozisyonları kullanarak sıralamanız önerilir.

Aşağıdaki derleme sorgusu, iki departmanın sonuçlarını birleştirir ve MAAŞ sütununa göre sıralar.

SELECT employee_id, first_name, salary
FROM employees
WHERE department_id=10
UNION
SELECT employee_id, first_name, salary
FROM employees
WHERE department_id=20
ORDER BY 3;