SORU
21 Mayıs 2009, PERŞEMBE


SQL sol vs birden fazla tablo satırı birleştirme?

Çoğu SQL lehçeleri aşağıdaki sorgu her iki kabul:

SELECT a.foo, b.foo
FROM a, b
WHERE a.x = b.x

SELECT a.foo, b.foo
FROM a
LEFT JOIN b ON a.x = b.x

Şimdi belli ki bir dış birleştirmek gerekir, ikinci sözdizimi gereklidir. Ama bir iç yaparken neden ilk (veya tersi) ikinci sözdizimi tercih katılmalıyım?

CEVAP
21 Mayıs 2009, PERŞEMBE


Eski sözdizimi, tablolar listesi ve belirtmek katılın kriterleri WHERE madde kullanarak, en modern veritabanlarında onaylanmaz.

Sadece şov için değil, eski sözdizimi aynı sorguda hem İÇ hem de DIŞ birleşimler kullandığınızda belirsiz olma ihtimali vardır.

Sana bir örnek vereyim.

Hadi sistem 3 tablo olduğunu varsayalım:

Company
Department
Employee

Her tabloya çok sayıda satır, birbirine bağlı içerir. Birden fazla firma var ve her firmanın birçok bölüm var ve her bölüm birden fazla çalışanı olabilir.

Şimdi aşağıdakileri yapmak istiyorum:

Tüm şirketlerin listesini ve tüm departmanları ve tüm çalışanları vardır. Bazı şirketler herhangi bölümleri henüz yok, ama onları dahil emin olun unutmayın. Sadece çalışanlar var, ama her zaman tüm şirketlerin listesi bölümleri almak emin olun.

Bu yüzden:

SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
  AND Department.ID = Employee.DepartmentID

Bir iç var en son sen sadece insanlarla bölümleri istediğiniz kriterleri yerine getirmek için katılın, unutmayın.

Şimdi ne olacak Peki, o kadar. Sorun Veritabanı Altyapısı sorgu iyileştiricisi, dizinler ve tablo istatistiklerini bağlıdır. Açıklamama izin ver.

Eğer sorgu iyileştiricisi belirleyen yol yapmak için önce bir şirket, sonra bulmak bölümler, ve sonra bir iç birleşim ile çalışanlar, gitmeyeceksin, değil almak herhangi bir şirketleri yok bölümler.

Bunun nedeni WHERE fıkra belirlersatırnihai sonuç, satırları tek tek parçalar değil.

Ve bu durumda, sol dolayı, Bölüm katılın.KİMLİK sütunu BOŞ olacaktır, ve böylece Çalışan için İÇ BİRLEŞİM gelince, Çalışan satır için bu kısıtlama yerine getirmek için bir yol var, ve bu yüzden görünmezler.

Eğer sorgu iyileştiricisi bölümü çalışan ilk katılmak ve bir sol şirketleriyle mücadele katılmak için karar verirse, diğer taraftan, onları göreceksiniz.

Eski sözdizimi belirsiz. Bir şekilde ne istediğinizi belirtmek için sorgu ipuçları ile uğraşmadan yok, ve bazı veritabanları hiçbir yolu yok.

Yeni sözdizimi girin, bunu seçebilirsiniz.

Eğer tüm şirketler istiyorsanız örneğin, problem tanımı belirtildiği gibi, bu yazabilirsiniz:

SELECT *
FROM Company
     LEFT JOIN (
         Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
     ) ON Company.ID = Department.CompanyID

Burada bölüm işçinin katılın yapılması gereken bir katılmak ve daha sonra bu sonuçları katıl sol şirketlerle olarak istediğinizi belirtin.

Ayrıca, diyelim ki sadece kendi adına X harfi içeren bölümler. Yine, eski stil katılır, seni kaybetme riski şirket de, olmazsa herhangi bir departmana sahip bir X adını, ama yeni bir sözdizimi:

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 fıkra katıldığınız için kullanılır, ama tüm satır için bir filtre değildir. Satır şirket bilgileri ile görünebilir, ama o şirketin adını X ile bölümü yoktur çünkü bu satır için tüm bölüm ve çalışanların sütun boş Değerlere sahip olabilir. Bu eski sözdizimi ile sabit.

Bu yüzden, diğer satıcılar arasında, Microsoft eski dış kullanım dışı sözdizimi, ama eski iç değil, sözdizimi, bu yana SQL Server 2005 ve yukarı birleşimdir. Tek yolu konuşmak için bir veritabanı üzerinde çalışan Microsoft SQL Server 2005 veya 2008, kullanarak eski stili dış birleşim sözdizimi, ayarlar veritabanında 8.0 uyumluluk modu (aka SQL Server 2000).

Ayrıca, eski yol, yan, söyleyerek benzer olduğu bir grup ile sorgu iyileştiricisi tablo bir avuç atarak, "işte, en iyisini yap". Yeni sözdizimi, sorgu iyileştiricisi birlikte gider ne bulmak için yapmak için daha az çalışma vardır.

Bu yüzden siz sahipsiniz.

Ve KATILMAK SOL İÇ geleceğin dalgası.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • chickenby

    chickenby

    2 HAZİRAN 2008
  • How It Should Have Ended

    How It Shoul

    5 Mart 2007
  • ThePointblank

    ThePointblan

    18 Aralık 2006