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.