Birleşim sorgusu kullanarak birden çok sorguyu tek bir sonuçta bir araya getirme

Birleşim sorgusu kullanarak birden çok sorguyu tek bir sonuçta bir araya getirme

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 basit seçme sorgularını tasarlamaya aşina olmanız gerekmektedir. Seçme sorgularını tasarlama hakkında daha fazla bilgi için bkz. Basit seçme sorgusu oluşturma.

Not:  Bu makaledeki içerik, Access masaüstü veritabanlarında kullanıma yöneliktir. Access web veritabanlarında veya Access web app'te birleşim sorgusu oluşturamaz veya kullanamazsınız.

Ç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 Dosya > Yeni seçeneğine tıklayarak başlangıç sayfasında arayabilir veya bir kopyasını şu konumdan doğrudan 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ından farklı olarak birleşim sorgusunda tablolar ilişkili değildir, yani Access grafik sorgu tasarımcısı birleşim sorguları oluşturma ve düzenlemede kullanılamaz. Bunu, birleşim sorgusunu Gezinti Bölmesi’nden açarsanız yaşarsınız; Access sorguyu açar ve sonuçları veri sayfası görünümünde gösterir. 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ğini incelemeye devam etmek için sorguyu tanımlayan SQL sözdizimini görüntülemek üzere Giriş > Görünümler > SQL Görünümü’ne tıklayın. Bu şekilde, birleşim sorgusunu oluşturan çeşitli kısımları kolayca görebilmeniz için SQL’de ek boşluklar ekledik.

Tarayıcınız video desteklemiyor. Microsoft Silverlight, Adobe Flash Player veya Internet Explorer 9'u yükleyin.

Şimdi Northwind veritabanındaki bu birleşim sorgusunun SQL sözdizimini ayrıntılı bir şekilde 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. Tabloyu Göster iletişim kutusunda, dahil etmek istediğiniz alanları içeren tabloyu çift tıklatın. Tablo, sorgu tasarım penceresine eklenir.

  3. Tabloyu Göster iletişim kutusunu kapatın.

  4. 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.

  5. İsteğe bağlı olarak, alan kılavuzunun Ölçüt satırına uygun ifadeleri yazarak, alanlarınıza ölçüt ekleyin.

  6. 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.

  7. Sorguyu Tasarım görünümüne geçirin.

  8. Seçme sorgusunu kaydedin ve açık bırakın.

  9. 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. Tabloyu Göster iletişim kutusunu kapatın.

  3. 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ştur.

  4. Birleşim sorgusuna birleştirmek istediğiniz ilk seçme sorgusunun sekmesini tıklatın.

  5. Giriş sekmesinde Görünüm> SQL Görünümü'ne tıklayın.

  6. Seçme sorgusunun SQL ifadesini kopyalayın. Önceden oluşturmaya başladığınız birleşim sorgusunun sekmesini tıklatın.

  7. Birleşim sorgusunun SQL görünümü nesne sekmesine, seçme sorgusunun SQL deyimini yapıştırın.

  8. Seçme sorgusu SQL ifadesinin sonundaki noktalı virgülü (;) silin.

  9. İmleci bir satır aşağı taşımak için Enter tuşuna basın, ardından yeni satıra UNION yazın.

  10. Birleşim sorgusuna birleştirmek istediğiniz sonraki seçme sorgusunun sekmesini tıklatın.

  11. 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.

  12. 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.

Tarayıcınız video desteklemiyor. Microsoft Silverlight, Adobe Flash Player veya Internet Explorer 9'u yükleyin.

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.

Ö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ülerken tüm çalışanlar örnek şirket adıyla listelenir ve bu da muhtemelen pek faydalı olmayacaktır. 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];

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

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 bir alan için Access, tanımladığınız veri türünün sabit değerlerini döndürür. Elbette, bu sorgunun çıktısının sonuçlarla çatışmamasını istersiniz. O yüzden bundan kaçınmaya yönelik bir püf noktası Yanlış’a bir 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 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ını diğer kayıtlardan görsel olarak ayırmak için her iki sorguda “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.

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

Önceden bahsi geçen birleşim sorgusunda Satın Alma Siparişi Kimliğinin dahil edilmediğini ve iki alanın iki farklı kayıt oluşturmadığını görebilirsiniz.

Tüm kayıtları dahil etmek istiyorsanız SQL’inizde UNION yerine UNION ALL’u kullanın. Bu muhtemelen sonuçların sıralamasını etkileyecektir. Dolayısıyla bir sıralama düzeni de belirlemek üzere bir ORDER BY yan tümcesi eklemek isteyebilirsiniz. Önceki örnekten oluşturun değiştirilmiş SQL şö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

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, <Tümü> ve "*" sabit değerleri ile önceden gösterilen dokuz kaydın birleşimini 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

    Ardından formun kullanıcısı form kayıtlarını belirli bir şehir adı ile filtreleyebilir veya tüm şehirlere ilişkin tüm kayıtları listelemek üzere <Tümü> öğesini seçebilir.

Sayfanın Başı

Office yeteneklerinizi geliştirin
Eğitimleri keşfedin
Yeni özellikleri ilk olarak siz edinin
Office Insider Programına Katılın

Bu bilgi yararlı oldu mu?

Görüşleriniz için teşekkür ederiz!

Geri bildiriminiz için teşekkürler! Office destek temsilcilerimizden biriyle görüşmeniz yararlı olabilir.

×