Alasan kanggo OUTER JOIN

Ngomong-ngomong, apa sampeyan kelingan nalika nggabungake spreadsheet lan tugas ngresiki kantor ilang amarga durung ana sing ngresiki?

Yen sampeyan mbukak pitakon kaya iki:

SELECT * FROM task

Banjur kita entuk asil iki:

id id_karyawan jeneng deadline
1 1 Ndandani bug ing frontend 2022-06-01
2 2 Ndandani bug ing backend 2022-06-15
3 5 Tuku kopi 2022-07-01
4 5 Tuku kopi 2022-08-01
5 5 Bakal tuku kopi 2022-09-01
6 (NULL) Ngresiki kantor (NULL)
7 4 Seneng urip (NULL)
8 6 Seneng urip (NULL)

Tugas "Clear Office" bakal ilang yen kita nyoba nggabungake tabel tugas karo tabel karyawan dening employee_id.

Kanggo ngatasi masalah iki, macem-macem modifier wis ditambahake menyang operator JOIN sing ngidini baris yatim piatu bisa disimpen tanpa pasangan ing meja liyane.

Ayo kula ngelingake sampeyan babagan wangun klasik operator JOIN:

table 1 JOIN table 2 ON condition

Kita bisa ngandhani SQL Server kanggo mesthekake yen kabeh data saka meja kiwa (table1) ana ing tabel gabungan. Malah yen ora ana pasangan kanggo wong-wong mau ing meja tengen. Kanggo nindakake iki, sampeyan mung kudu nulis:

table 1 LEFT JOIN table 2 ON condition

Yen sampeyan pengin tabel gabungan duwe kabeh baris saka tabel tengen , sampeyan kudu nulis:

table 1 RIGHT JOIN table 2 ON
 condition

Ayo nulis pitakon sing bakal nggabungake kabeh tugas lan karyawan supaya tugas tanpa eksekutor ora ilang. Kanggo nindakake iki, tulis pitakon:

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

Lan asil saka pitakonan iki:

id jeneng pendhudhukan gaji umur join_date id id_karyawan jeneng
1 Iwan Iwan Programmer 100000 25 30-06-2012 1 1 Ndandani bug ing frontend
2 Petrov Petruk Programmer 80000 23 2013-08-12 2 2 Ndandani bug ing backend
4 Rabinovich Moisha direktur 200000 35 2015-05-12 7 4 Seneng urip
5 Kirienko Anastasia Kantor manager 40000 25 10-10-2015 3 5 Tuku kopi
5 Kirienko Anastasia Kantor manager 40000 25 10-10-2015 4 5 Tuku kopi
5 Kirienko Anastasia Kantor manager 40000 25 10-10-2015 5 5 Tuku kopi
6 Vaska kucing 1000 3 2018-11-11 8 6 Seneng urip
(NULL) (NULL) (NULL) (NULL) (NULL) (NULL) 6 (NULL) Ngresiki kantor

Baris liyane wis ditambahake ing meja kita, lan sing menarik, ana akeh nilai NULL. Kabeh data sing dijupuk saka tabel karyawan ditampilake minangka NULL, amarga ora ana eksekutor saka meja karyawan kanggo tugas "kantor resik".

jinis JOIN

Ana 4 jinis JOIN total. Padha ditampilake ing tabel ing ngisor iki:

entri singkat entri dawa Panjelasan
1 GABUNG GABUNGAN BATIN Mung cathetan sing ana ing tabel A lan B
2 NINGGAL GABUNGAN KIRI OUTER JOIN Kabeh larik tanpa pasangan saka Tabel A kudu
3 TEngen gabung TEngen njaba gabung Kabeh larik tanpa pasangan saka tabel B kudu
4 OUTER JOIN FULL OUTER JOIN Kabeh baris pasangan basa saka tabel A lan B kudu

Kanggo gamblang, yen kita makili tabel minangka set, banjur JOIN bisa ditampilake minangka gambar:

Setel persimpangan tegese kanggo siji tabel ana rekaman sing cocog saka tabel liyane sing dirujuk.

Pitakonan saka wawancara

Kadhangkala programer anyar dibombardir karo pitakonan sing gampang banget nalika wawancara. Diwenehi tabel kita, bisa dirumusake kaya ing ngisor iki:

"Tulis pitakon sing bakal nampilake dhaptar kabeh karyawan sing ora ana tugas ." Kaping pisanan, ayo nyoba maneh pitakonan iki rada: "Tulis pitakon sing bakal nampilake dhaptar kabeh karyawan saka tabel karyawan sing ora ana tugas ing tabel tugas ." Kita kudu njaluk set iki:

Ana akeh cara kanggo ngatasi masalah iki, nanging aku bakal miwiti karo sing paling gampang: Pisanan, sampeyan bisa nggabungake tabel kita kanthi KANGGO KIRI, banjur gunakake WHERE kanggo ngilangi kabeh baris sing data sing ilang wis diisi NULL.

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

Lan asil saka pitakonan iki:

id jeneng pendhudhukan gaji umur join_date id id_karyawan jeneng
3 Ivanov Sergey Tester 40000 telung puluh 2014-01-01 (NULL) (NULL) (NULL)

Kerugian mung saka solusi iki yaiku ing kene baris ing tabel ngemot NULL, lan kanthi syarat kita kudu nampilake dhaptar karyawan.

Kanggo nindakake iki, sampeyan kudu dhaptar kolom sing dibutuhake ing tabel karyawan ing SELECT, utawa yen sampeyan kudu nampilake kabeh, sampeyan bisa nulis konstruksi ing ngisor iki:

SELECT e.* FROM employee e, task t 

Panjaluk lengkap bakal katon kaya iki:

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

asil saka pitakonan iki:

id jeneng pendhudhukan gaji umur join_date
3 Ivanov Sergey Tester 40000 telung puluh 2014-01-01

Liyane saka cara ditinggalake kanggo PR. Aku ora pengin nyuda sampeyan saka kesenengan nemokake dhewe.