Yalnızca tabloları listeleyen WHERE
ve birleştirme ölçütlerini belirtmek için yan tümcesi kullanan eski sözdizimi çoğu modern veritabanında kullanımdan kaldırılmıştır.
Sadece şov için değil, aynı sorguda hem INNER hem de OUTER birleşimlerini kullandığınızda eski sözdiziminin belirsiz olma olasılığı vardır.
Sana bir örnek vereyim.
Sisteminizde 3 tablonuz olduğunu varsayalım:
Company
Department
Employee
Her tablo birbirine bağlı çok sayıda satır içerir. Birden fazla şirketiniz var ve her şirketin birden çok departmanı olabilir ve her departmanın birden fazla çalışanı olabilir.
Tamam, şimdi aşağıdakileri yapmak istiyorsunuz:
Tüm şirketleri listeleyin ve tüm departmanlarını ve tüm çalışanlarını ekleyin. Bazı şirketlerin henüz departmanları olmadığını, ancak bunları da dahil ettiğinizden emin olun. Yalnızca çalışanları olan departmanları aldığınızdan emin olun, ancak her zaman tüm şirketleri listeleyin.
Yani bunu yaparsınız:
SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
AND Department.ID = Employee.DepartmentID
Sonuncunun sadece insanlarla departmanlar olmasını istediğiniz kriterleri yerine getirmek için bir iç birleşim olduğunu unutmayın.
Tamam, şimdi ne olacak. Sorun, veritabanı motoruna, sorgu iyileştiriciye, dizinlere ve tablo istatistiklerine bağlı olmasıdır. Açıklamama izin ver.
Sorgu iyileştirici, bunu yapmanın yolunun önce bir şirket almak, sonra departmanları bulmak ve daha sonra çalışanlarla içsel bir katılım yapmak olduğunu belirlerse, departmanı olmayan herhangi bir şirket elde edemezsiniz.
Bunun nedeni, WHERE
cümlenin satırların tek tek bölümlerini değil, hangi satırın nihai sonuçla sonuçlandığını belirlemesidir .
Ve bu durumda, sol katılma nedeniyle, Department.ID sütunu NULL olur ve bu nedenle INNER, Employee JOIN söz konusu olduğunda, Employee satırı için bu kısıtlamayı yerine getirmenin bir yolu yoktur ve bu nedenle görünür.
Öte yandan, sorgu optimize edici önce departman-çalışan katılımı ile başa çıkmaya karar verirse ve daha sonra şirketlerle sol katılım gerçekleştirirse, bunları göreceksiniz.
Yani eski sözdizimi belirsiz. Sorgu ipuçlarıyla uğraşmadan ne istediğinizi belirtmenin bir yolu yoktur ve bazı veritabanlarının hiçbir yolu yoktur.
Yeni sözdizimini girin, bununla seçim yapabilirsiniz.
Örneğin, tüm şirketlerin olmasını istiyorsanız, sorunun açıklandığı gibi, şunu yazardınız:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID
Burada departman-çalışan katılımının bir katılım olarak yapılmasını ve ardından bunun sonuçlarına şirketler ile katılmasını istediğinizi belirtirsiniz.
Ayrıca, yalnızca adlarında X harfini içeren departmanları istediğinizi varsayalım. Yine, eski stil birleşmeleriyle, adını da X olan herhangi bir departman yoksa, ancak yeni sözdizimi ile, şirketi de kaybetme riskiyle karşı karşıya kalırsınız:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID AND Department.Name LIKE '%X%'
Bu ek yan tümce, birleştirme için kullanılır, ancak tüm satır için bir filtre değildir. Dolayısıyla satır şirket bilgileriyle görünebilir, ancak o satır için tüm departman ve çalışan sütunlarında NULL olabilir, çünkü o şirket için adında X olan bir departman yoktur. Eski sözdizimi ile bu zor.
Bu nedenle, diğer satıcıların yanı sıra Microsoft, SQL Server 2005 ve sonrasındaki eski dış birleştirme sözdizimini kullanımdan kaldırmıştır, ancak eski iç birleştirme sözdizimini kullanımdan kaldırmıştır. Eski stil dış birleştirme sözdizimini kullanarak Microsoft SQL Server 2005 veya 2008 üzerinde çalışan bir veritabanıyla konuşmanın tek yolu, bu veritabanını 8.0 uyumluluk modunda (SQL Server 2000 olarak da bilinir) ayarlamaktır.
Ayrıca, eski yol, bir grup WHERE yan tümcesi ile sorgu optimize ediciye bir grup tablo atarak, "işte buradasınız, elinizden gelenin en iyisini yapın" demeye benziyordu. Yeni sözdizimiyle, sorgu iyileştiricinin hangi parçaların bir araya geldiğini anlamak için daha az işi vardır.
İşte burada.
SOL ve INNER JOIN geleceğin dalgasıdır.