dependent table
Ngayon pasimplehin natin ng kaunti ang ating mga query. Magdagdag tayo ng bagong talahanayan ng gawain sa aming database na may mga gawain para sa aming mga empleyado. At tingnan natin kung anong mga entry ang nilalaman nito:
SELECT * FROM task
Ang resulta ng naturang kahilingan:
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) |
Ang talahanayang ito ay may 4 na column lamang:
- id — natatanging numero ng gawain (at mga hilera sa talahanayan);
- employee_id — ID ng empleyado mula sa talahanayan ng empleyado kung kanino itinalaga ang gawain;
- pangalan - pangalan at paglalarawan ng gawain;
- deadline - ang oras kung kailan dapat makumpleto ang gawain.
Bigyang-pansin ang ilang mga nuances. Walang empleyado_id ang Task N6, wala kaming tagalinis. Ang gawain ay naroroon, ngunit ang gumaganap ay wala. Nangyayari ito.
Gayundin, ang mga gawain 6-9 ay walang nakatakdang takdang oras. Nangyayari ito kapag ang isang gawain ay dapat gawin nang regular at tuluy-tuloy. Halimbawa, ang opisina ay kailangang linisin araw-araw, ngunit kailangan mo ring i-enjoy ang buhay araw-araw :)
Kung ang isang talahanayan ay gumagamit ng mga ID mula sa isa pang talahanayan, ang naturang talahanayan ay tinatawag na dependent .
Query laban sa maramihang mga talahanayan
Dito makikita sa talahanayan ng gawain na mayroong dalawang gawain na "Enjoying life". Paano natin malalaman kung sino ang mga maswerteng ito?
Upang gawin ito, sa SQL, maaari kang magsagawa ng query sa dalawang talahanayan nang sabay-sabay. Sa pangkalahatan, sa SQL, maaari kang mag-query ng anumang bilang ng mga talahanayan sa parehong oras. Ang pangkalahatang format para sa naturang kahilingan ay:
SELECT columns
FROM Table 1, table 2, tableN
Mahalaga! Kung sumulat ka ng isang query sa ilang mga talahanayan sa parehong oras, pagkatapos ay bilang isang resulta makakakuha ka ng tinatawag na Cartesian na produkto ng mga hilera ng talahanayan. Ang bawat hilera mula sa unang talahanayan ay ididikit sa bawat hilera mula sa pangalawang talahanayan, at iba pa.
Ibig sabihin, kung mayroon kang 5 row sa unang table at 10 row sa pangalawa, magkakaroon ka ng 50 row sa kabuuan. Sa Java, ang query na ito ay magiging ganito:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Isulat natin ang ating query sa dalawang talahanayan nang sabay-sabay at tingnan kung ano ang mangyayari:
SELECT * FROM employee, task
At ang resulta ng query na ito:
id | pangalan | hanapbuhay | suweldo | edad | id | empleyado | _id | pangalan | deadline |
---|---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmer | 100000 | 25 | 1 | 1 | Ayusin ang isang bug sa frontend | 2022-06-01 | |
2 | Petrov Petr | Programmer | 80000 | 23 | 1 | 1 | Ayusin ang isang bug sa frontend | 2022-06-01 | |
3 | Ivanov Sergey | Tester | 40000 | tatlumpu | 1 | 1 | Ayusin ang isang bug sa frontend | 2022-06-01 | |
4 | Rabinovich Moisha | Direktor | 200000 | 35 | 1 | 1 | Ayusin ang isang bug sa frontend | 2022-06-01 | |
5 | Kirienko Anastasia | Tagapamahala ng Opisina | 40000 | 25 | 1 | 1 | Ayusin ang isang bug sa frontend | 2022-06-01 | |
6 | Vaska | pusa | 1000 | 3 | 1 | 1 | Ayusin ang isang bug sa frontend | 2022-06-01 | |
1 | Ivanov Ivan | Programmer | 100000 | 25 | 2 | 2 | Ayusin ang isang bug sa backend | 2022-06-15 | |
2 | Petrov Petr | Programmer | 80000 | 23 | 2 | 2 | Ayusin ang isang bug sa backend | 2022-06-15 | |
3 | Ivanov Sergey | Tester | 40000 | tatlumpu | 2 | 2 | Ayusin ang isang bug sa backend | 2022-06-15 | |
4 | Rabinovich Moisha | Direktor | 200000 | 35 | 2 | 2 | Ayusin ang isang bug sa backend | 2022-06-15 | |
5 | Kirienko Anastasia | Tagapamahala ng Opisina | 40000 | 25 | 2 | 2 | Ayusin ang isang bug sa backend | 2022-06-15 |
Mayroon kaming 48 na mga linya ng resulta sa kabuuan, ngunit dito ay nagbigay lamang ako ng 11. Kung hindi, hindi magkakaroon ng sapat na espasyo.
Bigyang-pansin ang tatlong bagay:
- Mga column na may parehong pangalan: id . Ito ang id mula sa talahanayan ng empleyado at ang id mula sa talahanayan ng gawain .
- Ang mga hilera ng bawat talahanayan ay paulit-ulit. Sa kaliwang column, ang ID 6 ay sinusundan ng ID = 1 muli.
- Mayroon kaming mga walang katuturang row kung saan, halimbawa, ang id (mula sa talahanayan ng empleyado) ay 6 at sa parehong hilera ang employee_id ay 1.
Pag-alis ng mga walang kabuluhang linya
Napakaraming row sa aming resultang table, na siyang Cartesian product ng lahat ng row ng dalawang table na empleyado at gawain .
Logically, kung ang row employee_id ay 3, dapat lang itong dumikit sa row mula sa employee table kung saan ang id ay 3. Subukan nating ayusin ang hindi pagkakaunawaan sa WHERE.
Sumulat tayo ng isang query tulad nito:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
At ang resulta ng query na ito:
id | pangalan | hanapbuhay | suweldo | edad | id | emploee_id | pangalan | deadline |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Programmer | 100000 | 25 | 1 | 1 | Ayusin ang isang bug sa frontend | 2022-06-01 |
2 | Petrov Petr | Programmer | 80000 | 23 | 2 | 2 | Ayusin ang isang bug sa backend | 2022-06-15 |
4 | Rabinovich Moisha | Direktor | 200000 | 35 | 7 | 4 | Masiyahan sa buhay | (WALA) |
5 | Kirienko Anastasia | Tagapamahala ng Opisina | 40000 | 25 | 3 | 5 | Bumili ng kape | 2022-07-01 |
5 | Kirienko Anastasia | Tagapamahala ng Opisina | 40000 | 25 | 4 | 5 | Bumili ng kape | 2022-08-01 |
5 | Kirienko Anastasia | Tagapamahala ng Opisina | 40000 | 25 | 5 | 5 | Bibili ng kape | 2022-09-01 |
6 | Vaska | pusa | 1000 | 3 | 8 | 6 | Masiyahan sa buhay | (WALA) |
Ang magandang balita ay nawala na ang mga walang kabuluhang linya: ang id mula sa unang column ay palaging katumbas ng employee_id.
Ang masamang balita ay ang mga gawaing hindi nakatalaga sa sinuman, tulad ng paglilinis ng opisina, ay wala na. Ang kanilang employee_id ay NULL, kaya sila ay itinapon pagkatapos gawin ang WHERE.
GO TO FULL VERSION