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

Bazen, bir tablo veya sorgudaki kayıtları bir veya birden çok başka tablodaki kayıtlarla tek bir sonuçta birleştirmek isteyebilirsiniz. Access'te birleşim sorgusu böyle yapılır.

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.

Ç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 faydalı olabilir. Northwind örnek şablonunu Access'in başlangıç sayfasında Dosyala>Yeni'yi seçerek arayabilirsiniz. Ayrıca doğrudan Northwind örnek şablonundan bir kopyasını da indirebilirsiniz.

Access Northwind veritabanını açtıktan sonra ilk olarak karşınıza çıkan oturum açma iletişim kutusunu kapatın ve Gezinti Bölmesi'ni genişletin. Gezinti Bölmesi'nin en üstünü seçin ve sonra tüm veritabanı nesnelerini türe 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. Bu, birleşim sorguları oluşturmak veya düzenlemek için Access grafik sorgu tasarımcısını kullanamayacağınız anlamına gelir. Birleşim sorgusunu Gezinti Bölmesi'nden açarsanız, Access sorguyu açar ve sonuçları veri sayfası görünümünde gösterir. Giriş sekmesindeki Görünümler altında, birleşim sorgularıyla çalışırken Tasarım Görünümü'nün kullanılamadığına dikkat edin. 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 söz dizimini görüntülemek üzere Giriş>Görünümleri>SQL Görünümü'neSQL tıklayın. Bu çizimde, birleşim sorgusunu oluşturan çeşitli kısımları kolayca görebilmeniz için ek boşluklar SQL ekledik.

Şimdi Northwind veritabanındaki bu birleşim sorgusunun söz dizimine ayrıntılı bir şekilde bakalım SQL :


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 ifadenin SQL ikinci kısmı, Access'e UNION bu iki kayıt kümesini birleştirmesini söyleyen anahtar sözcüktür.

Bu deyimin SQL son kısmı bir ORDER BY deyim kullanarak birleştirilmiş kayıtların sırasını belirler. Bu örnekte Access, tüm kayıtları Sipariş Tarihi alanına göre azalan sıralamada sıralar.

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 söz dizimini doğrudan SQL Görünümü'ne yazarak SQL 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. Dahil etmek istediğiniz alanları içeren tabloyu çift tıklatı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 deyimleri kopyalayıp yapıştırarak SQL oluşturursunuz.

  1. Oluştur sekmesinin Sorgular grubunda Sorgu Tasarımı üzerine tıklayı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 sekme boştur.
  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. SQL Seçme sorgusunun 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 ifadesini yapıştırınSQL.
  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 ve ardından yeni satıra yazın UNION .
  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 tüm deyimlerini SQL 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 ifadesinden SQL 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 anahtar sözcüğü eklediğinizden UNION 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 ardından deyimi ORDER BYSQL Görünümü'ndeki birleşim sorgusuna 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 sorgu 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];
    

Söz dizimini yazmak SQL sizi rahatsız etmiyorsa birleşim sorgusu için kendi SQL deyiminizi doğrudan SQL Görünümü'nde 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 bölümde yer alan ve 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 adı yerine sabit bir değer ekleyebilirsiniz. Bu şuna SQL benzer:


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 çıktı alanlarının adlarını yalnızca birleşim sorgusundaki ilk sorgudan okuduğundan, sorguyu daha da kısaltabilirsiniz. Burada, ikinci ve üçüncü sorgu bölümlerinin çıktıları kaldırılır:


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 sorguyu tek tek filtreleyebilirsiniz. Önceki bölümün birleşim sorgusuna ekleme yapacak olursak, her bir sorguyu yan WHERE tümce ekleyerek filtreleyen bir örnek aşağıda verilmiştir.


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ştirdiğiniz 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ı Satın Alma ve Satış olmak üzere iki alana bölmek istediğinizi varsayalım. Ayrıca değerin olmadığı alanlar için sabit sıfır değeri istediğinizi varsayalım. Bu birleşim sorgusu 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 değerleri içeren alanların boş olmasını istiyorsak ne yapabiliriz? Anahtar sözcüğü burada gösterildiği gibi ekleyerek sıfır Null yerine hiçbir şey görüntülenmemesi için SQL 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? Bu deneme için şöyle SQL görünebilir:

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 biri, sorguyu alan değerinin bir sayı olmasını beklemesine zorlamaktır. Şu ifadeyle bunu yapabilirsiniz:


IIf(False, 0, Null)

Denetlemenin koşulu, Falsehiçbir zaman True, değildir, bu nedenle ifade her zaman döndürür Null. Bununla birlikte, Access her iki çıktı seçeneğini de değerlendirir ve çıktıyı sayısal veya Null.

Ç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ştirmeniz gerekmez.

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 numara. Koşul her zaman false olduğundan, sorgu 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

Bu örnekte, Northwind veritabanındaki birleştirilmiş sorgu 100 kayıt döndürürken, iki sorgu ayrı ayrı 58 ve 43 kayıt olmak üzere toplamda 101 kayıt döndürür. Bu fark, iki kaydın benzersiz olmamasından kaynaklanır. Bu senaryoyu çözmek için UNION ALL kullanarak birleşim sorgularında ayrı kayıtlarla çalışma bölümüne bakın.UNION ALL

Birleşim sorgusunda toplamları ekleme

Birleşim sorgusunun özel kullanımlarından biri de 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.

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. Bu birleşim sorgusunu SQL aşağıdakileri içerecek Product ID = 48şekilde 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

Elbette, bir kayıt toplam miktarın iki katını döndürmez.

Bu sonucu, Satın Alma Ayrıntıları tablosunda kaydedildiği gibi, bir günde aynı miktarda çikolata iki kez satıldığı için görüyorsunuz. 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ı UNION ALLUNION eklemek istiyorsanız yerine .SQL Bu büyük olasılıkla sonuçların sıralamasını etkileyecektir, dolayısıyla sıralama düzenini belirlemek üzere bir ORDER BY yan tümce eklemek isteyebilirsiniz. İşte önceki örneğe göre değiştirilmiş SQL :


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öz dizimini 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. Bununla birlikte, aşağıdakileri kullanarak SQLsorguyu genişletin ve 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 grubu şunları içermediğinden UNION ALL, Access yalnızca ayrı kayıtları döndürür. Bu, her şehrin sabit aynı değerlerle yalnızca bir kez döndürüleceği anlamına gelir.

  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. Filter Formun kendisinde, birleşik giriş kutusu denetiminde seçilen değeri kullanarak bir form filtresini etkinleştirmek için aşağıdaki gibi bir kod 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 için Tümü'nü> seçebilir<.

Sayfanın Başı