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.
GO TO FULL VERSION