UNION Operatörü ile Sorgu Yazmak – Bölüm 39

Bu bölümde, birden fazla input değerini UNION operatörü kullanarak tek bir sonuçta birleştirmeyi öğreneceğiz. UNION ve UNION ALL ifadeleri, bir kümeyi diğerine eklemek için kullanılır, böylelikle iki veya daha fazla sorgunun sonuç kümeleri tek bir sonuç kümesi haline getirilebilir. JOIN ile kaynak sütunlar birleştirirken UNION ile satırlar yığınlanır.

Kümeler Arası Etkileşimler

SQL Server’da, her biri input kümeleri üzerinde farklı bir etkiye sahip olan birkaç adet operatör bulunur. Küme operatörlerini kullanmaya başlamadan önce bunların bazı ortak özelliklerinden bahsedelim:

  • Her input kümesi, SELECT ifadesi bileşenleri bulundurabilen bir sorgunun sonucudur. (ORDER BY ifadesi hariç).
  • Input kümeleri aynı sayıda sütuna ve sütunlar da uyumlu veri türüne sahip olmalıdır. Sütunların veri türleri başlangıçta uyumlu değilse, veri tipi dönüşümüyle uyumlu hale getirilmelidir. Implicit dönüşüm destekleniyorsa implicit gerçekleştirilir, aksi takdirde explicit dönüşüm gerekebilir (CAST veya CONVERT ile).
  • NULL değerlerin karşılaştırılması bölümünde anlatılanın aksine, bir kümedeki NULL değeri, diğer kümedeki NULL değerine eşit kabul edilir.
  • Her operatörün DISTINCT ve ALL şeklinde iki formu olduğu düşünülebilir. Örneğin, UNION DISTINCT iki kümeyi birleştirirken tekrarlı satırları ortadan kaldırır; UNION ALL ise tekrarlı kayıtlar dahil tüm kayıtları birleştirir. SQL Server’da bulunan set operatörlerinin hepsinde bu iki form desteklenmez.

Not: Set operatörleriyle çalışırken, küme teorisine göre bir kümede sıralama düzeni sağlanmadığını ve kümenin yalnızca benzersiz satırlar içerdiğini hatırlamakta fayda var. Sıralı sonuçlara ihtiyacınız varsa, sorguda ORDER BY ifadesi kullanabilirsiniz.

UNION Operatörü Kullanımı

UNION operatörüyle bir input kümesindeki satırları diğer input kümesinden gelen satırlarla sonuç kümesine birleştirebilirsiniz. Eğer bir satır her iki input kümesinde de bulunuyorsa, bu satır sonuç kümesine bir kez döndürülür. Tekrarlı satırlar UNION operatörü tarafından elenmektedir.

Örneğin, TSQL örnek veri tabanında, Production.Suppliers tablosunda 29 satır ve Sales.Customers tablosunda 91 satır bulunmaktadır.

İki veri tabanındaki tüm satırların birleşimi 29+91 toplam 120 satır verir. Ancak, her iki tabloda da görünen tekrarlı kayıtlar yalnızca bir kez döndürüldüğünden, bu örnekte UNION 93 satır döndürecektir:

SELECT country, city
FROM Production.Suppliers
UNION
SELECT country, city
FROM Sales.Customers;

Dönen sonuç:

country city
--------- ---------------
Argentina Buenos Aires
Australia Melbourne
...
USA Walla Walla
Venezuela Barquisimeto
Venezuela Caracas
Venezuela I. de Margarita
Venezuela San Cristóbal
(93 row(s) affected) 

Not: Tüm T-SQL ifadelerinde olduğu gibi set operatörleri tarafından hiçbir sıralama işlemi sağlanmaz. Sonuçlar sıralanmış gibi görünse de aslında bir filtreleme işleminin ürünüdür. Sonuçların sıralı bir şekilde olmasını istiyorsanız ikinci sorgunun sonunda ORDER BY ifadesini kullanabilirsiniz.

Daha önce de belirtildiği gibi, set operatörleri kavramsal olarak iki şekilde düşünülebilir: DISTINCT ve ALL. SQL Server gerçekte UNION ALL uygular. ANSI SQL standartlarına göre ikiside açık ifadelerdir (UNION DISTINCT ve UNION ALL). T-SQL’de DISTINCT kullanımı desteklenmemektedir fakat implicit olarak kullanılan varsayılan işlemdir. Bunun anlamı, UNION kullanıldığında, her kümedeki satırları birleştirir ve ardından yinelenenler filtrelenir.

Performans açısından UNION, tekrarlı satırlar olsun ya da olmasın bir filtre işlemi gerçekleştirir. Kümeleri birleştirirken kümelerde tekrarlı kayıtların olmadığından eminseniz UINION ALL kullanarak distinct filtresinin işlem yükünden kurtulabilirsiniz.

UNION ALL Operatörü

UNION ALL operatörü, UNION operatörüne benzer şekilde çalışır, iki inut sonuç kümesini bir çıkış sonuç kümesinde birleştirir. UNION ALL ifadesinin UNION ifadesinden farkı, UNION ALL ile tekrarlı kayıtlar filtrelenmez.

Aşağıdaki örnekte, tüm lokasyon kayıtlarını tüm müşteri lokasyon kayıtlarıyla birleştirmek için UNION ALL kullanılmıştır ve böylece önceki konu başlığındaki örneği de geliştirmiş olduk:

SELECT country, city
FROM Production.Suppliers
UNION ALL
SELECT Country, City
FROM Sales.Customers; 

UNION ALL kullanıldığında 120 satır döndürülür (Production.Suppliers tablosundan 29 satır ve Sales.Customers tablosundan 91 satır):

country city
------- ---------------
UK London
USA New Orleans
...
Finland Helsinki
Poland Warszawa
(120 rows affected)  

Tekrarlı kayıtların olmadığından emin olunan ya da bunların gerekli olduğu durumlarda, UNION yerine tekrarlı kayıtlara filtre uygulanmayan UNION ALL ifadesi kullanılmalıdır.

UNION ALL ifadesi, aynı veri kümesinde genellikle UNION’dan önemli ölçüde daha hızlı çalışır. Bu performans farkı, input sonuç kümesindeki satır sayısı arttıkça daha belirgin hale gelir.

Kaynak:
UNION (Transact-SQL)

Leave a Reply

Your email address will not be published. Required fields are marked *