Birden çok sorguyu tek bir sonuçta birleştirmek için birleşim sorgusu kullanma

Uygulandığı Öğe
Microsoft 365 için Access Access 2024 Access 2021 Access 2019 Access 2016

Bazen bir kayıt kümesi oluşturmak üzere bir tablo ya da bir veya daha çok tablodan olan sorgulardaki kayıtları listeleyerek iki veya daha fazla tabloda yer alan kayıtların tümünün listesini elde etmek isteyebilirsiniz. Access’teki birleşim sorgusunun amacı budur.

Birleşim sorgularını etkili bir şekilde anlamak için öncelikle Access'te temel seçme sorguları tasarlama konusunda bilgi sahibi olmanız gerekir. Seçme sorguları tasarlama hakkında daha fazla bilgi edinmek için bkz. Basit seçme sorgusu oluşturma.

Çalışan bir birleşim sorgusu örneğini inceleyin

Daha önce hiç birleşim sorgusu oluşturmadıysanız Northwind Access şablonundaki çalışan bir örneği incelemek sizin için faydalı olabilir. Northwind örnek şablonunu Access'in başlarken sayfasında Dosya>Yeni'ye tıklayarak arayabilir veya doğrudan şu konumdan bir kopya indirebilirsiniz: Northwind örnek şablonu.

Access Northwind veritabanını açtıktan sonra ilk olarak karşınıza çıkan oturum açma iletişim formunu kapatın ve Gezinti Bölmesi’ni genişletin. Gezinti Bölmesi’nin en üstüne tıklayın ve sonra tüm veritabanı nesnelerini türlerine göre düzenlemek için Nesne Türü’nü seçin. Ardından Sorgular grubunu genişletin ve Ürün İşlemleri adında bir sorgu görürsünüz.

Birleşim sorgularını diğer sorgu nesnelerinden kolayca ayırt edebilirsiniz çünkü bu sorgularda iki kümeden oluşturulmuş bir birleşik kümeyi ifade eden birbirine dolanmış iki daireyi andıran özel bir simge yer almaktadır:

Access'te birleşim sorgusu simgesinin ekran görüntüsü. Normal seçme ve eylem sorgularının aksine, birleşim sorgusunda tablolar ilişkili değildir; bu da Access grafik sorgu tasarımcısının birleşim sorguları oluşturmak veya düzenlemek için kullanılamayacağı anlamına gelir. Gezinti Bölmesi'nden birleşim sorgusu açarsanız bu sorunla karşılaşırsınız; Access bunu açar ve sonuçları veri sayfası görünümünde görüntüler. Giriş sekmesindeki Görünümler komutu altında, birleşim sorgularıyla çalışırken Tasarım Görünümü’nün kullanılabilir olmadığını görürsünüz. Birleşim sorgularıyla çalışırken yalnızca Veri Sayfası Görünümü ile SQL Görünümü arasında geçiş yapabilirsiniz.

Bu birleşim sorgusu örneğine ilişkin çalışmanıza devam etmek için Giriş>Görünümleri>SQL Görünümü'ne tıklayarak bunu tanımlayan SQL söz dizimini görüntüleyin. Bu şekilde, birleşim sorgusunu oluşturan çeşitli kısımları kolayca görebilmeniz için SQL’de ek boşluklar ekledik.

Şimdi Northwind veritabanından bu birleşim sorgusunun SQL söz dizimini ayrıntılı olarak inceleyelim:


SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Bu SQL deyiminin birinci ve üçüncü parçaları temelde iki seçme sorgusudur. Bu sorgular biri Ürün Siparişleri tablosundan ve diğeri de Ürün Satın Almaları tablosundan olmak üzere iki farklı kayıt kümesini alır.

Bu SQL deyiminin ikinci kısmı, Access’e sorgunun bu iki kayıt kümesini birleştireceğini söyleyen UNION anahtar sözcüğüdür.

SQL deyiminin son kısmı ORDER BY deyimini kullanarak birleştirilmiş kayıtların sıralamasını belirler. Bu örnekte Access, tüm kayıtları Sipariş Tarihi alanına göre azalan sıralamada sıralayacaktır.

Not

Birleşim sorguları Access’te daima salt okunurdur; veri sayfası görünümünde hiçbir değeri değiştiremezsiniz.

Seçme sorguları oluşturarak ve birleştirerek birleşim sorgusu oluşturma

Her ne kadar SQL görünümünde doğrudan SQL sözdizimini yazarak bir birleşim sorgusu oluşturabilseniz de seçme sorgular ile parçalar halinde oluşturmanın daha kolay olduğunu göreceksiniz. Ardından SQL kısımlarını kopyalayıp yapıştırarak bir birleşim sorgusuna dönüştürebilirsiniz.

Adımları okumayı atlayarak bir örneğini izlemek istiyorsanız bir sonraki bölüme bkz. Birleşim sorgusu oluşturma örneğini izleyin.

  1. Oluştur sekmesinin Sorgular grubunda Sorgu Tasarımı'nı tıklatın.
  2. Eklemek istediğiniz alanları içeren tabloya çift tıklayın. Tablo, sorgu tasarım penceresine eklenir.
  3. Sorgu tasarım penceresinde, dahil etmek istediğiniz her alanı çift tıklatın. Alanları seçerken, diğer seçme sorgularına eklediğiniz aynı sayıda ve aynı sırada alan eklediğinizden emin olun. Alanların veri türlerine dikkat edin ve birleştirmekte olduğunuz diğer sorgulardaki aynı konumda bulunan alanlarla uyumlu veri türlerine sahip olduklarından emin olun. Örneğin, ilk seçme sorgunuzda ilki tarih/saat verileri içeren beş alan varsa, birleştirdiğiniz diğer seçme sorgularının her birinde de ilki tarih/saat verileri içeren beş alan olduğundan emin olun.
  4. İsteğe bağlı olarak, alan kılavuzunun Ölçüt satırına uygun ifadeleri yazarak, alanlarınıza ölçüt ekleyin.
  5. Alanları ve alan ölçütlerini eklemeyi tamamladığınızda, seçme sorgusunu çalıştırıp bu sorgunun çıkışını gözden geçirmeniz gerekir. Tasarım sekmesinin Sonuçlar grubunda Çalıştır'a tıklayın.
  6. Sorguyu Tasarım görünümüne geçirin.
  7. Seçme sorgusunu kaydedin ve açık bırakın.
  8. Bu yordamı, birleştirmek istediğiniz her seçme sorgusu için yineleyin.

Seçme sorgularınızı oluşturduğunuza göre artık bunları birleştirelim. Bu adımda birleşim sorgusunu SQL deyimlerini kopyalayıp yapıştırarak oluşturursunuz.

  1. Oluştur sekmesinin Sorgular grubunda Sorgu Tasarımı'nı tıklatın.
  2. Tasarım sekmesindeki Sorgu grubunda Birleşim’e tıklayın. Access sorgu tasarım penceresini gizler ve SQL görünümü nesne sekmesini gösterir. Bu noktada, SQL görünümü nesne sekmesi boş olur.
  3. Birleşim sorgusuna birleştirmek istediğiniz ilk seçme sorgusunun sekmesini tıklatın.
  4. Giriş sekmesindeSQL GörünümünüGörüntüle'ye> tıklayın.
  5. Seçme sorgusunun SQL ifadesini kopyalayın. Önceden oluşturmaya başladığınız birleşim sorgusunun sekmesini tıklatın.
  6. Birleşim sorgusunun SQL görünümü nesne sekmesine, seçme sorgusunun SQL deyimini yapıştırın.
  7. Seçme sorgusu SQL ifadesinin sonundaki noktalı virgülü (;) silin.
  8. İmleci bir satır aşağı taşımak için Enter tuşuna basın, ardından yeni satıra UNION yazın.
  9. Birleşim sorgusuna birleştirmek istediğiniz sonraki seçme sorgusunun sekmesini tıklatın.
  10. 5 ila 10 arası adımları, seçme sorgularının SQL deyimlerini birleşim sorgusunun SQL görünümü penceresine kopyalayıp yapıştırıncaya kadar yineleyin. Noktalı virgülü silmeyin ya da son seçme sorgusunun SQL deyiminden sonra bir şey yazmayın.
  11. Tasarım sekmesinin Sonuçlar grubunda Çalıştır'ı tıklatın.

Birleşim sorgunuzun sonuçları Veri sayfası görünümünde görüntülenir.

Birleşim sorgusu oluşturma örneğini izleme

Northwind örnek veritabanında yeniden oluşturabileceğiniz bir örnek şudur. Bu birleşim sorgusu kişi adlarını Müşteriler tablosundan alır ve bunları Tedarikçiler tablosundaki kişi adlarıyla birleştirir. Birlikte devam etmek istiyorsanız Northwind örnek veritabanı kopyanızda şu adımları gerçekleştirin.

Bu örneği oluşturmak için gereken adımlar şunlardır:

  1. Sırasıyla, Müşteriler ve Tedarikçiler tablolarının veri kaynakları olarak yer aldığı Sorgu1 ve Sorgu2 adlı iki seçme sorgusu oluşturun. Ad ve Soyad alanlarını görünen değerler olarak kullanın.

  2. Başlangıçta hiçbir veri kaynağı olmayan Sorgu3 adlı yeni bir sorgu oluşturun ve bu sorguyu bir Birleşim sorgusuna dönüştürmek için Tasarım sekmesindeki Birleşim komutuna tıklayın.

  3. Sorgu1 ve Sorgu2’deki SQL deyimlerini kopyalayıp Sorgu3’e yapıştırın. Fazladan olan noktalı virgülü kaldırdığınızdan ve UNION anahtar sözcüğünü eklediğinizden emin olun. Ardından sonuçlarınızı veri sayfası görünümünden kontrol edebilirsiniz.

  4. Sorgulardan birine bir sıralama yan tümcesi ekleyin ve sonra ORDER BY deyimini birleşim sorgusu SQL görünümüne yapıştırın. Birleşim sorgusu olan Sorgu3’te sıralama eklenirken ilk önce noktalı virgül ve ardından alan adlarından tablo adı kaldırılır.

  5. Bu birleşim sorgusu örneği için adları birleştiren ve sıralayan son SQL aşağıda verilmiştir:

    SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
    FROM Customers
    
    UNION
    
    SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
    FROM Suppliers
    
    ORDER BY [Last Name], [First Name];
    

SQL sözdizimini yazmak sizi rahatsız etmiyorsa birleşim sorgusuna ilişkin kendi SQL deyiminizi doğrudan SQL görünümüne yazabilirsiniz. Ancak SQL’i diğer sorgu nesnelerinden kopyalayıp yapıştırma yaklaşımı oldukça faydalı olabilmektedir. Her bir sorgu, burada kullanılan basit seçme sorgusu örneklerinden çok daha karmaşık olabilmektedir. Birleşim sorgusu olarak birleştirmeden önce her bir sorguyu dikkatle oluşturup test etmek sizin yararınıza olacaktır. Birleşim sorgusu çalışmazsa başarılı olana kadar her bir sorguyu tek tek ayarlayabilir ve birleşim sorgunuzu düzeltilmiş sözdizimiyle birlikte yeniden oluşturabilirsiniz.

Birleşim sorgularını kullanma hakkında ipuçları ve püf noktaları hakkında daha fazla bilgi edinmek için bu makalenin diğer kısımlarını inceleyin.

Üç veya daha fazla tablo veya sorguyu birleşim sorgusunda birleştirme

Önceki kısımdaki Northwind veritabanının kullanıldığı örnekte yalnızca iki tablodaki veriler birleştirilmiştir. Ancak birleşim sorgusunda üç veya daha fazla tabloyu kolayca birleştirebilirsiniz. Örneğin, önceki örnekten devam edecek olursak sorgu çıktısına çalışanların adlarını da eklemek isteyebilirsiniz. Bu görevi üçüncü bir sorgu ekleyip ek bir UNION anahtarıyla birlikte önceki SQL deyimini birleştirerek şu şekilde gerçekleştirebilirsiniz:


SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Sonucu veri sayfası görünümünde görüntülediğinizde, tüm çalışanlar örnek şirket adıyla listelenir ve bu büyük olasılıkla çok kullanışlı değildir. Alanın bir kişinin şirket içi çalışanı, tedarikçideki bir çalışan veya müşteri olduğunu göstermesini istiyorsanız şirket yerine bir sabit değer ekleyebilirsiniz. SQL şöyle görünür.


SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers

UNION

SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers

UNION

SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Sonuç, veri sayfası görünümünde şöyle görünür. Access şu beş örnek kaydı gösterir:

İstihdam Soyadı Adı
Şirket içi Yılmaz Gamze
Şirket içi Yıldız Emine
Tedarikçi Şahin Recep
Müşteri Şimşek Halit
Müşteri Güngör Ali

Access birleşim sorgusundaki ilk sorguda yer alan çıktı alanlarının yalnızca adlarını okuduğundan yukarıdaki sorgu daha da kısaltılabilir. Burada, ikinci ve üçüncü sorgu bölümlerindeki çıktıları kaldırdığımızı görüyorsunuz:


SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers

UNION

SELECT "In-house", [Last Name], [First Name]
FROM Employees

ORDER BY [Last Name], [First Name];

Birleşim sorgularında filtreleme

Access birleşim sorgusunda sıralamaya yalnızca bir kez izin verilir ancak her bir sorgu tek tek filtrelenebilir. Önceki bölümün birleşim sorgusuna ekleme yapacak olursak WHERE yan tümcesi ekleyerek her bir sorguyu filtrelediğimiz bir örneği aşağıda görebilirsiniz.


SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"

UNION

SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"

UNION

SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"

ORDER BY [Last Name], [First Name];

Veri sayfası görünümüne geçtiğinizde sonuçları şuna benzer biçimde görürsünüz:

İstihdam Soyadı Adı
Tedarikçi Ahmet Emel A.
Şirket içi Yılmaz Gamze
Müşteri Mert Özgür
Şirket içi Özkan Deniz
Tedarikçi Tekin Pınar
Müşteri Karaca Salih
Tedarikçi Özkan Mehmet
Tedarikçi Koçak Haluk
Şirket içi Arslan Kerim
Tedarikçi Doğan Aysu
Şirket içi Ünal Buğra

Veri türlerini karıştırma

Birleştirilecek sorgular çok farklıysa çıktı alanının farklı veri türlerindeki verileri birleştirmesinin gerektiği bir durumla karşılaşabilirsiniz. Böyle bir durumda veri türü hem metin hem de sayıları içerebildiğinden birleşim sorgusu sonuçları metin veri türü olarak döndürür.

Bunu nasıl çalıştığını anlamak için Northwind örnek veritabanında Ürün İşlemleri birleşim sorgusunu kullanacağız. Bu örnek veritabanını açın ve sonra veri sayfası görünümünde Ürün İşlemleri sorgusunu açın. Son on kayıt şu çıktıya benzer olmalıdır.

Ürün Kimliği Sipariş Tarihi Şirket Adı İşlem Miktar
77 22.01.2006 Tedarikçi B Satın Alma 60
80 22.01.2006 Tedarikçi D Satın Alma 75
81 22.01.2006 Tedarikçi A Satın Alma 125
81 22.01.2006 Tedarikçi A Satın Alma 200
7 20.01.2006 Şirket D Satış 10
51 20.01.2006 Şirket D Satış 10
80 20.01.2006 Şirket D Satış 10
34 15.01.2006 Şirket AA Satış 100
80 15.01.2006 Şirket AA Satış 30

Miktar alanının Satın Alma ve Satış olmak üzere ikiye bölünmesini istediğinizi varsayalım. Ayrıca değerin olmadığı alanlar için sabit sıfır değerinin olmasını istediğinizi varsayalım. Bu birleşim sorgusuna ilişkin SQL şöyle görünür:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC; 

Veri sayfası görünümüne geçtiğinizde son on kaydın aşağıdaki gibi görüntülendiğini görürsünüz:

Ürün Kimliği Sipariş Tarihi Şirket Adı İşlem Satın Alma Satış
74 22.01.2006 Tedarikçi B Satın Alma 20 0
77 22.01.2006 Tedarikçi B Satın Alma 60 0
80 22.01.2006 Tedarikçi D Satın Alma 75 0
81 22.01.2006 Tedarikçi A Satın Alma 125 0
81 22.01.2006 Tedarikçi A Satın Alma 200 0
7 20.01.2006 Şirket D Satış 0 10
51 20.01.2006 Şirket D Satış 0 10
80 20.01.2006 Şirket D Satış 0 10
34 15.01.2006 Şirket AA Satış 0 100
80 15.01.2006 Şirket AA Satış 0 30

Bu örneğe devam edersek, sıfır yazan alanların boş olmasını istiyorsak ne yapabiliriz? Aşağıdaki gibi Null anahtar sözcüğünü ekleyerek sıfır yerine hiçbir şey göstermemek üzere SQL’i değiştirebilirsiniz:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Ancak veri sayfası görünümüne geçtiğinizde göreceğiniz üzere beklenmeyen bir sonuçla karşılaşırsınız. Satın Alma sütununda tüm alanlar silinir

Ürün Kimliği Sipariş Tarihi Şirket Adı İşlem Satın Alma Satış
74 22.01.2006 Tedarikçi B Satın Alma
77 22.01.2006 Tedarikçi B Satın Alma
80 22.01.2006 Tedarikçi D Satın Alma
81 22.01.2006 Tedarikçi A Satın Alma
81 22.01.2006 Tedarikçi A Satın Alma
7 20.01.2006 Şirket D Satış 10
51 20.01.2006 Şirket D Satış 10
80 20.01.2006 Şirket D Satış 10
34 15.01.2006 Şirket AA Satış 100
80 15.01.2006 Şirket AA Satış 30

Bunun olmasının nedeni Access’in alanların veri türlerini birinci sorguya dayalı olarak belirlemesidir. Bu örnekte Null bir sayı değildir.

Peki alanların boş değerleri için boş bir dize eklemeye çalışırsanız ne olur? Bunu denemeye ilişkin SQL aşağıdaki gibidir:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Veri sayfası görünümüne geçtiğinizde Access’in Satıın Alma değerlerini aldığını ancak değerleri metne dönüştürdüğünü görürsünüz. Veri sayfası görünümünde sola hizalı olmalarından bunların metin değerleri olduğunu anlayabilirsiniz. Bu sonuçları görmenizin sebebi ilk sorgudaki boş dizenin bir sayı olmamasıdır. Ayrıca Satış değerlerinin de metne dönüştürüldüğünü görürsünüz çünkü satın alma kayıtları boş bir dize içerir.

Ürün Kimliği Sipariş Tarihi Şirket Adı İşlem Satın Alma Satış
74 22.01.2006 Tedarikçi B Satın Alma 20
77 22.01.2006 Tedarikçi B Satın Alma 60
80 22.01.2006 Tedarikçi D Satın Alma 75
81 22.01.2006 Tedarikçi A Satın Alma 125
81 22.01.2006 Tedarikçi A Satın Alma 200
7 20.01.2006 Şirket D Satış 10
51 20.01.2006 Şirket D Satış 10
80 20.01.2006 Şirket D Satış 10
34 15.01.2006 Şirket AA Satış 100
80 15.01.2006 Şirket AA Satış 30

O halde bu bulmacayı nasıl çözersiniz?

Çözümlerden birisi sorguyu alan değerinin bir sayı olmasını beklemesine zorlamaktır. Bu çözüm, şu ifadeyle gerçekleştirilebilir:


IIf(False, 0, Null)

Yanlış denetleme koşul asla Doğru olmaz dolayısıyla ifade daima Null değerini döndürür ancak Access her iki çıktı seçeneğini değerlendirir ve çıktının sayı veya Null olduğuna karar verir.

Çalışan örneğimizde bu ifadeyi şöyle kullanırız:


SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

İkinci sorguyu değiştirmenin gerekli olmadığını unutmayın.

Veri sayfası görünümüne geçtiğinizde istediğimiz sonucu görürsünüz:

Ürün Kimliği Sipariş Tarihi Şirket Adı İşlem Satın Alma Satış
74 22.01.2006 Tedarikçi B Satın Alma 20
77 22.01.2006 Tedarikçi B Satın Alma 60
80 22.01.2006 Tedarikçi D Satın Alma 75
81 22.01.2006 Tedarikçi A Satın Alma 125
81 22.01.2006 Tedarikçi A Satın Alma 200
7 20.01.2006 Şirket D Satış 10
51 20.01.2006 Şirket D Satış 10
80 20.01.2006 Şirket D Satış 10
34 15.01.2006 Şirket AA Satış 100
80 15.01.2006 Şirket AA Satış 30

Aynı sonucu elde etmeye yönelik alternatif bir yöntem ise sorguları birleşim sorgusunun önüne diğer bir sorgu olarak eklemektir:

SELECT 
  0 As [Product ID], Date() As [Order Date], 
  "" As [Company Name], "" As [Transaction], 
  0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

Her alan için Access, tanımladığınız veri türünün sabit değerlerini döndürür. Tabii ki, bu sorgunun çıktısının sonuçlarla çakışmasını istemezsiniz, bu nedenle bundan kaçınmanın püf noktası False'a where yan tümcesi eklemektir:

WHERE False

Bu küçük bir püf noktasıdır çünkü sorgu daima yanlıştır ve herhangi bir şey döndürmez. Bu deyimi mevcut SQL ile birleştirerek elde ettiğimiz tamamlanmış deyim şöyledir:

SELECT 
  0 As [Product ID], Date() As [Order Date], 
  "" As [Company Name], "" As [Transaction], 
  0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False

UNION

SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]

UNION

SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]

ORDER BY [Order Date] DESC;

Not

Northwind veritabanının kullanıldığı bu örnekteki birleştirilmiş sorgu 100 kayıt döndürür ancak iki sorgu ayrı ayrı 58 ve 43 kayıt olmak üzere toplamda 101 kayıt döndürür. Bu uyuşmazlığın nedeni iki kaydın benzersiz olmamasıdır. UNION ALL kullanarak bu senaryoyu çözmeyi öğrenmek için Birleşim sorgularında UNION ALL kullanarak ayrı kayıtlarla çalışma bölümüne bakın.

Birleşim sorgusunda toplamları ekleme

Birleşim sorgusunun özel durumlarından birisi bir kayıt kümesini bir veya daha fazla alanın toplamını içeren bir kayıtla birleştirmektir.

Birleşim sorgusunda bir toplamı elde etmeyi göstermek üzere Northwind örnek veritabanında oluşturabileceğiniz diğer bir örnek şöyledir.

  1. Aşağıdaki SQL sözdizimini kullanarak satın alınan biraları (Northwind veritabanında ürün kimliği=34’tür) görüntülemek üzere basit bir yeni sorgu oluşturun:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
    
  2. Veri sayfası görünümüne geçtiğinizde dört satın alma görürsünüz:

    Alınma Tarihi Miktar
    22.01.2006 100
    22.01.2006 60
    04.04.2006 50
    05.04.2006 300
  3. Toplamı elde etmek için aşağıdaki SQL’i kullanarak basit bir toplama sorgusu oluşturun:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
  4. Veri sayfası görünümüne geçtiğinizde yalnızca tek bir kayıt görürsünüz:

    Alınma MaksTarihi MiktarToplamı
    05.04.2006 510
  5. Toplam miktarın olduğu kaydı satın alma kayıtlarına eklemek için bu iki sorguyu birleşim sorgusu olarak birleştirin:

    SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    UNION
    
    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
    
    ORDER BY [Purchase Order Details].[Date Received];
    
  6. Veri sayfası görünümüne geçtiğinizde her birinin toplamını içeren dört satın almayı ve devamında miktarı toplayan bir kayıt görürsünüz:

    Alınma Tarihi Miktar
    22.01.2006 60
    22.01.2006 100
    04.04.2006 50
    05.04.2006 300
    05.04.2006 510

Temel olarak toplamları birleşim sorgusuna eklemek bu kadardır. Toplam kaydı diğer kayıtlardan görsel olarak ayırmak için her iki sorguya da "Ayrıntı" ve "Toplam" gibi sabit değerler eklemek isteyebilirsiniz. Üç veya daha fazla tablo veya sorguyu birleşim sorgusunda birleştirme bölümünden sabit değerleri kullanmayı gözden geçirebilirsiniz.

UNION ALL kullanarak birleşim sorgularında ayrı kayıtlarla çalışma

Access’te birleşim sorguları, varsayılan olarak, yalnızca ayrı kayıtları içerir. Peki tüm kayıtları dahil etmek istiyorsanız ne yapabilirsiniz? Bir örneğe daha bakmak burada faydalı olabilir.

Önceki bölümde, birleşim sorgusunda bir toplam oluşturmayı göstermiştik. Ürün Kimliği= 48’i eklemek üzere bu birleşim sorgusu SQL’ini değiştirin:


SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION

SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Purchase Order Details].[Date Received];

Veri sayfası görünümüne geçtiğinizde biraz yanıltıcı bir sonuç görürsünüz:

Alınma Tarihi Miktar
22.01.2006 100
22.01.2006 200

Bir kayıt, toplamda miktarın iki katını döndürmez.

Bu sonucu görmenizin sebebi Satın Alma Ayrıntıları tablosunda kaydedildiği gibi bir günde aynı miktarda çikolatanın iki kere satılmış olmasıdır. Northwind örnek veritabanındaki iki kaydı gösteren basit bir seçme sorgusu sonucu aşağıda verilmiştir:

Satın Alma Siparişi Kimliği Ürün Miktar
100 Northwind Traders Chocolate 100
92 Northwind Traders Chocolate 100

Daha önce not edilen birleşim sorgusunda, Satınalma Siparişi Kimliği alanının dahil edilmediğini ve iki alanın iki ayrı kayıt oluşturmadığını görebilirsiniz.

Tüm kayıtları eklemek istiyorsanız SQL'inizde UNION yerine UNION ALL kullanın. Bunun sonuçların sıralanması üzerinde büyük olasılıkla bir etkisi olacaktır, bu nedenle sıralama düzenini belirlemek için ORDER BY yan tümcesi de eklemek isteyebilirsiniz. Önceki örnekten alınan değiştirilmiş SQL derlemesi şöyledir:


SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

UNION ALL

SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))

ORDER BY [Total];

Veri sayfası görünümüne geçtiğinizde tüm ayrıntıları ve ek olarak son kayıt olarak toplamı görürsünüz:

Alınma Tarihi Toplam Miktar
22.01.2006 100
22.01.2006 100
22.01.2006 Toplam 200

Açılan kutu denetimi ile formdaki kayıtları filtrelemek üzere birleşim sorgusu kullanma

Birleşim sorgusunun yaygın kullanımlarından biri, formdaki açılan kutu denetimi için kayıt kaynağı görevi görmektir. Form kayıtlarını filtrelemek üzere bir değer seçmek için bu açılan kutuyu kullanabilirsiniz. Örneğin, çalışan kayıtlarını şehre göre filtrelemek gibi.

Bunun nasıl çalıştığını görmek için bu senaryoyu sergilemek üzere Northwind örnek veritabanında oluşturabileceğiniz diğer bir örnek aşağıda verilmiştir.

  1. Bu SQL sözdizimini kullanarak basit bir seçme sorgusu oluşturun:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
    
  2. Veri sayfası görünümüne geçtiğinizde aşağıdaki sonuçları görürsünüz:

    Şehir Filtre
    Seattle Seattle
    Bellevue Bellevue
    Redmond Redmond
    Kirkland Kirkland
    Seattle Seattle
    Redmond Redmond
    Seattle Seattle
    Redmond Redmond
    Seattle Seattle
  3. Bu sonuçlara baktığınızda çok fazla değer görmeyebilirsiniz. Sorguyu genişletip aşağıdaki SQL’i kullanarak birleşim sorgusuna dönüştürün:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
    
  4. Veri sayfası görünümüne geçtiğinizde aşağıdaki sonuçları görürsünüz:

    Şehir Filtre
    <Tümü> *
    Bellevue Bellevue
    Kirkland Kirkland
    Redmond Redmond
    Seattle Seattle

    Access, daha önce gösterilen dokuz kaydın birleşimini Tümü> ve "*" sabit alan değerleriyle <gerçekleştirir.
    Bu birleşim UNION ALL içermediğinden Access yalnızca ayrı kayıtları döndürür, yani her bir şehir sabit aynı değerler ile yalnızca bir kez döndürülür.

  5. Artık etkili bir şekilde tüm şehirleri seçme seçeneğiyle birlikte her bir şehir adını yalnızca bir kez gösteren tamamlanmış bir birleşim sorgusuna sahip olduğunuza göre bu sorguyu bir formdaki açılan kutuya yönelik kayıt kaynağı olarak kullanabilirsiniz. Bu belirli örneği bir model olarak kullanarak bir formda açılan kutu denetimi oluşturabilir, bu sorguyu kayıt kaynağı olarak ayarlayabilir, görsel olarak gizlemek için Filtre sütununun Sütun Genişliği özelliğini 0 (sıfır) olarak ayarlayabilir ve ardından ikinci sütunun dizinini göstermek için İlişkili Sütun özelliğini 1 olarak ayarlayabilirsiniz. Formun kendisindeki Filtre özelliğinde, açılan kutu denetiminde seçilenlerin değerlerini kullanarak bir form filtresi oluşturmak üzere aşağıdaki kodu ekleyebilirsiniz:

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True
    

    Formun kullanıcısı daha sonra form kayıtlarını belirli bir şehir adına göre filtreleyebilir veya tüm şehirlerin tüm kayıtlarını listelemek için Tümü'ne> seçebilir<.

Sayfanın Başı