Mga Dahilan ng OUTER JOIN

Siyanga pala, naaalala mo ba noong pinagsama natin ang ating mga spreadsheet at nawala ang ating mga gawain sa paglilinis ng opisina dahil wala pang tagalinis?

Kung magpapatakbo ka ng query tulad nito:

SELECT * FROM task

Pagkatapos ay makuha namin ang resultang ito:

id emploee_id pangalan deadline
1 1 Ayusin ang isang bug sa frontend 2022-06-01
2 2 Ayusin ang isang bug sa backend 2022-06-15
3 5 Bumili ng kape 2022-07-01
4 5 Bumili ng kape 2022-08-01
5 5 Bibili ng kape 2022-09-01
6 (WALA) Linisin ang opisina (WALA)
7 4 Masiyahan sa buhay (WALA)
8 6 Masiyahan sa buhay (WALA)

Mawawala ang gawaing "Clear Office" kung susubukan naming isama ang talahanayan ng gawain sa talahanayan ng empleyado sa pamamagitan ng employee_id.

Upang malutas ang problemang ito, idinagdag ang iba't ibang modifier sa JOIN operator na nagpapahintulot sa mga ulilang hilera na maimbak nang walang pares sa ibang talahanayan.

Hayaan akong ipaalala sa iyo ang klasikong anyo ng JOIN operator:

table 1 JOIN table 2 ON condition

Maaari naming sabihin sa SQL Server upang matiyak na ang lahat ng data mula sa kaliwang talahanayan (table1) ay naroroon sa pinagsamang talahanayan. Kahit na walang pares para sa kanila sa tamang mesa. Upang gawin ito, kailangan mo lamang isulat:

table 1 LEFT JOIN table 2 ON condition

Kung gusto mong ang pinagsamang talahanayan ay magkaroon ng lahat ng mga hilera mula sa tamang talahanayan , pagkatapos ay kailangan mong isulat:

table 1 RIGHT JOIN table 2 ON
 condition

Sumulat tayo ng isang query na pagsasama-samahin ang lahat ng mga gawain at empleyado upang ang mga gawain na walang tagapagpatupad ay hindi mawala. Upang gawin ito, sumulat ng isang query:

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

At ang resulta ng query na ito:

id pangalan hanapbuhay suweldo edad Sumali sa date id emploee_id pangalan
1 Ivanov Ivan Programmer 100000 25 2012-06-30 1 1 Ayusin ang isang bug sa frontend
2 Petrov Petr Programmer 80000 23 2013-08-12 2 2 Ayusin ang isang bug sa backend
4 Rabinovich Moisha Direktor 200000 35 2015-05-12 7 4 Masiyahan sa buhay
5 Kirienko Anastasia Tagapamahala ng Opisina 40000 25 2015-10-10 3 5 Bumili ng kape
5 Kirienko Anastasia Tagapamahala ng Opisina 40000 25 2015-10-10 4 5 Bumili ng kape
5 Kirienko Anastasia Tagapamahala ng Opisina 40000 25 2015-10-10 5 5 Bumili ng kape
6 Vaska pusa 1000 3 2018-11-11 8 6 Masiyahan sa buhay
(WALA) (WALA) (WALA) (WALA) (WALA) (WALA) 6 (WALA) Linisin ang opisina

Ang isa pang hilera ay idinagdag sa aming talahanayan, at kawili-wili, mayroong maraming mga NULL na halaga sa loob nito. Ang lahat ng data na kinuha mula sa talahanayan ng empleyado ay ipinapakita bilang NULL, dahil walang tagapagpatupad mula sa talahanayan ng empleyado para sa gawaing "Clean office".

Mga uri ng SUMALI

Mayroong 4 na uri ng JOIN sa kabuuan. Ang mga ito ay ipinakita sa talahanayan sa ibaba:

Maikling pagpasok mahabang entry Paliwanag
1 SUMALI INNER JOIN Mga tala lamang na nasa talahanayan A at B
2 INIWANG SUMALI LEFT OUTER JOIN Lahat ng row na walang pares mula sa table A ay dapat
3 RIGHT JOIN RIGHT OUTER JOIN Ang lahat ng mga hilera na walang pares mula sa talahanayan B ay dapat na
4 OUTER JOIN FULL OUTER JOIN Ang lahat ng mga hilera ng mga pares ng base mula sa mga talahanayan A at B ay dapat na

Para sa pagiging simple, kung kinakatawan namin ang mga talahanayan bilang mga set, pagkatapos ay maaaring ipakita ang JOIN bilang isang larawan:

Itakda ang intersection ay nangangahulugan na para sa isang talahanayan ay may kaukulang talaan mula sa isa pang talahanayan kung saan ito tumutukoy.

Tanong mula sa panayam

Minsan ang mga baguhang programmer ay binobomba ng isang napakasimpleng tanong sa isang panayam. Dahil sa aming mga talahanayan, maaari itong mabalangkas tulad ng sumusunod:

"Sumulat ng query na magpapakita ng listahan ng lahat ng empleyado kung saan walang mga gawain ." Una, subukan nating i-rephrase ang tanong na ito nang kaunti: "Sumulat ng query na magpapakita ng listahan ng lahat ng empleyado mula sa talahanayan ng empleyado kung saan walang mga gawain sa talahanayan ng gawain ." Kailangan nating makuha ang set na ito:

Mayroong maraming mga paraan upang malutas ang problemang ito, ngunit magsisimula ako sa pinakasimpleng: Una, maaari mong samahan ang aming mga talahanayan na may LEFT JOIN, at pagkatapos ay gamitin ang WHERE upang ibukod ang lahat ng mga hilera kung saan ang nawawalang data ay nalagyan ng mga NULL.

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

At ang resulta ng query na ito:

id pangalan hanapbuhay suweldo edad Sumali sa date id emploee_id pangalan
3 Ivanov Sergey Tester 40000 tatlumpu 2014-01-01 (WALA) (WALA) (WALA)

Ang tanging kawalan ng solusyon na ito ay na dito ang mga hilera sa talahanayan ay naglalaman ng NULL, at ayon sa kundisyon kailangan naming magpakita ng isang listahan ng mga empleyado.

Upang gawin ito, kailangan mong ilista ang mga kinakailangang column ng talahanayan ng empleyado sa SELECT, o kung kailangan mong ipakita ang lahat ng mga ito, maaari mong isulat ang sumusunod na construction:

SELECT e.* FROM employee e, task t 

Ang kumpletong kahilingan ay magiging ganito:

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

ang resulta ng query na ito:

id pangalan hanapbuhay suweldo edad Sumali sa date
3 Ivanov Sergey Tester 40000 tatlumpu 2014-01-01

Ang natitirang mga pamamaraan ay naiwan sa iyo para sa takdang-aralin. Ayokong ipagkait sa iyo ang kasiyahang mahanap mo sila mismo.