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:
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.
- Oluştur sekmesinin Sorgular grubunda Sorgu Tasarımı'nı tıklatın.
- Dahil etmek istediğiniz alanları içeren tabloyu çift tıklatın. Tablo, sorgu tasarım penceresine eklenir.
- 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.
- İsteğe bağlı olarak, alan kılavuzunun Ölçüt satırına uygun ifadeleri yazarak, alanlarınıza ölçüt ekleyin.
- 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.
- Sorguyu Tasarım görünümüne geçirin.
- Seçme sorgusunu kaydedin ve açık bırakın.
- 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.
- Oluştur sekmesinin Sorgular grubunda Sorgu Tasarımı üzerine tıklayın.
- 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.
- Birleşim sorgusuna birleştirmek istediğiniz ilk seçme sorgusunun sekmesini tıklatın.
- Giriş sekmesindeSQL GörünümünüGörüntüle'ye> tıklayın.
-
SQLSeçme sorgusunun ifadesini kopyalayın. Önceden oluşturmaya başladığınız birleşim sorgusunun sekmesini tıklatın. - Birleşim sorgusunun SQL Görünümü nesne sekmesine, seçme sorgusunun ifadesini yapıştırın
SQL. - Seçme sorgusu
SQLifadesinin sonundaki noktalı virgülü (;) silin. - İmleci bir satır aşağı taşımak için Enter tuşuna basın ve ardından yeni satıra yazın
UNION. - Birleşim sorgusuna birleştirmek istediğiniz sonraki seçme sorgusunun sekmesini tıklatın.
- 5 ila 10 arası adımları, seçme sorgularının tüm deyimlerini
SQLbirleş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 ifadesindenSQLsonra bir şey yazmayın. - 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:
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.
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.
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
UNIONemin olun. Ardından sonuçlarınızı veri sayfası görünümünden kontrol edebilirsiniz.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.Bu birleşim sorgusu örneği için adları birleştiren ve sıralayan son
SQLsorgu 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.
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];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 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))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 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];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.
Bu
SQLsöz dizimini kullanarak basit bir seçme sorgusu oluşturun:SELECT Employees.City, Employees.City AS Filter FROM Employees;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 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;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.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.
FilterFormun 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 = TrueArdı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<.