OUTER JOIN'in nedenleri

Bu arada, e-tablolarımızı birleştirdiğimiz ve henüz bir temizleyici olmadığı için ofis temizliği görevlerimizin ortadan kalktığı zamanı hatırlıyor musunuz?

Bunun gibi bir sorgu çalıştırırsanız:

SELECT * FROM task

Sonra bu sonucu elde ederiz:

İD çalışan kimliği isim son teslim tarihi
1 1 Ön uçtaki bir hatayı düzeltin 2022-06-01
2 2 Arka uçtaki bir hatayı düzeltin 2022-06-15
3 5 kahve satın al 2022-07-01
4 5 kahve satın al 2022-08-01
5 5 kahve alacak 2022-09-01
6 (HÜKÜMSÜZ) ofisi temizle (HÜKÜMSÜZ)
7 4 Hayatın tadını çıkar (HÜKÜMSÜZ)
8 6 Hayatın tadını çıkar (HÜKÜMSÜZ)

Görev tablosunu çalışan_kimliği ile çalışan tablosuyla birleştirmeye çalışırsak “Clear Office” görevi kaybolur.

Bu sorunu çözmek için, JOIN operatörüne bu tür yetim satırların bir çift olmadan başka bir tabloda saklanmasına izin veren çeşitli değiştiriciler eklenmiştir.

JOIN operatörünün klasik halini hatırlatayım:

table 1 JOIN table 2 ON condition

SQL Server'a sol tablodaki (tablo1) tüm verilerin birleştirilmiş tabloda bulunduğundan emin olmasını söyleyebiliriz. Doğru masada onlar için bir çift olmasa bile. Bunu yapmak için, sadece yazmanız gerekir:

table 1 LEFT JOIN table 2 ON condition

Birleştirilmiş tablonun sağ tablodaki tüm satırlara sahip olmasını istiyorsanız , şunu yazmanız gerekir:

table 1 RIGHT JOIN table 2 ON
 condition

Yürütücüsü olmayan görevlerin kaybolmaması için tüm görevleri ve çalışanları birleştirecek bir sorgu yazalım. Bunu yapmak için bir sorgu yazın:

SELECT * FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id

Ve bu sorgunun sonucu:

İD isim meslek maaş yaş katılmak_tarihi İD çalışan kimliği isim
1 İvanov İvan Programcı 100000 25 2012-06-30 1 1 Ön uçtaki bir hatayı düzeltin
2 Petrov Petr Programcı 80000 23 2013-08-12 2 2 Arka uçtaki bir hatayı düzeltin
4 Rabinovich Moisha Müdür 200000 35 2015-05-12 7 4 Hayatın tadını çıkar
5 Kirienko Anastasia Ofis Yöneticisi 40000 25 2015-10-10 3 5 kahve satın al
5 Kirienko Anastasia Ofis Yöneticisi 40000 25 2015-10-10 4 5 kahve satın al
5 Kirienko Anastasia Ofis Yöneticisi 40000 25 2015-10-10 5 5 kahve satın al
6 Vaska kedi 1000 3 2018-11-11 8 6 Hayatın tadını çıkar
(HÜKÜMSÜZ) (HÜKÜMSÜZ) (HÜKÜMSÜZ) (HÜKÜMSÜZ) (HÜKÜMSÜZ) (HÜKÜMSÜZ) 6 (HÜKÜMSÜZ) ofisi temizle

Tablomuza bir satır daha eklendi ve ilginç bir şekilde içinde bir çok NULL değeri var. Çalışan tablosundan “Ofis Temizliği” görevi için yürütücü olmadığı için çalışan tablosundan alınan tüm veriler NULL olarak görüntülenir.

BİRLEŞTİRME türleri

Toplamda 4 tip JOIN vardır. Aşağıdaki tabloda sunulmuştur:

Kısa giriş uzun giriş Açıklama
1 KATILMAK İÇ BİRLEŞİM Yalnızca A ve B tablolarında bulunan kayıtlar
2 SOL YÖNDEN KATILIM SOL DIŞ KATILMA Tablo A'dan bir çift içermeyen tüm satırlar
3 SAĞ KATIL SAĞ DIŞ BİRLEŞİM Tablo B'den bir çift içermeyen tüm satırlar
4 DIŞ BİRLEŞTİRME TAM DIŞ BİRLEŞTİRME A ve B tablolarındaki tüm baz çifti sıraları

Basitlik için, tabloları kümeler halinde temsil edersek, JOIN bir resim olarak görüntülenebilir:

Set kesişimi, bir tablo için, başvuruda bulunduğu başka bir tablodan karşılık gelen bir kayıt olduğu anlamına gelir.

Röportajdan soru

Bazen acemi programcılar bir röportajda çok basit bir soruyla bombardımana tutulur. Tablolarımız göz önüne alındığında, aşağıdaki gibi formüle edilebilir:

" Görevi olmayan tüm çalışanların listesini görüntüleyecek bir sorgu yazın ." Öncelikle, bu soruyu biraz yeniden ifade etmeye çalışalım: " Görev tablosunda görev bulunmayan, çalışan tablosundaki tüm çalışanların listesini görüntüleyecek bir sorgu yazın ." Bu seti almamız gerekiyor:

Bu sorunu çözmenin pek çok yolu var ama ben en basitinden başlayacağım: İlk olarak, tablolarımızı LEFT JOIN ile birleştirebilir ve ardından NULL'larla eksik verilerin doldurulduğu tüm satırları hariç tutmak için WHERE'yi kullanabilirsiniz.

SELECT * FROM employee e LEFT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

Ve bu sorgunun sonucu:

İD isim meslek maaş yaş katılmak_tarihi İD çalışan kimliği isim
3 İvanov Sergey test cihazı 40000 otuz 2014-01-01 (HÜKÜMSÜZ) (HÜKÜMSÜZ) (HÜKÜMSÜZ)

Bu çözümün tek dezavantajı, burada tablodaki satırların NULL içermesi ve koşula göre bir çalışan listesi göstermemiz gerekmesidir.

Bunu yapmak için ya çalışan tablosunun gerekli sütunlarını SELECT'te listelemeniz gerekir ya da hepsini görüntülemeniz gerekiyorsa aşağıdaki yapıyı yazabilirsiniz:

SELECT e.* FROM employee e, task t 

Tam istek şöyle görünecektir:

SELECT e.*  
FROM employee e RIGHT JOIN task t ON e.id = t.emploee_id  
WHERE t.id IS NULL 

bu sorgunun sonucu:

İD isim meslek maaş yaş katılmak_tarihi
3 İvanov Sergey test cihazı 40000 otuz 2014-01-01

Yöntemlerin geri kalanı ödev için size bırakılmıştır. Onları kendin bulma zevkinden seni mahrum etmek istemiyorum.