függő táblázat

Most bonyolítsuk egy kicsit a kérdéseinket. Adjunk hozzá egy új feladattáblázatot az adatbázisunkhoz a munkatársaink feladataival. És lássuk, milyen bejegyzéseket tartalmaz:

SELECT * FROM task

Egy ilyen kérés eredménye:

id employee_id név határidő
1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
2 2 Javítson ki egy hibát a háttérben 2022-06-15
3 5 Vegyél kávét 2022-07-01
4 5 Vegyél kávét 2022-08-01
5 5 Kávét fog venni 2022-09-01
6 (NULLA) Takarítsd ki az irodát (NULLA)
7 4 Élvezd az életet (NULLA)
8 6 Élvezd az életet (NULLA)

Ez a táblázat csak 4 oszlopot tartalmaz:

  • id – egyedi feladatszám (és a táblázat sorai);
  • munkavállaló_azonosítója — annak az alkalmazottnak az azonosítója az alkalmazotti táblából, akihez a feladat hozzá van rendelve;
  • név – a feladat neve és leírása;
  • határidő - az az idő, ameddig a feladatot el kell végezni.

Ügyeljen néhány árnyalatra. Az N6 feladatnak nincs munkavállalói azonosítója, nincs takarítónk. A feladat megvan, de az előadó nem. Megtörténik.

Továbbá a 6-9. feladatoknak nincs kitűzött határideje. Ez akkor fordul elő, ha egy feladatot rendszeresen és folyamatosan kell elvégezni. Például az irodát minden nap takarítani kell, de minden nap élvezni is kell az életet :)

Ha egy tábla egy másik táblából származó azonosítókat használ, akkor egy ilyen táblát függőnek nevezünk .

Több tábla lekérdezése

Itt látjuk a feladattáblázatban, hogy két feladat van „Az élet élvezete”. Honnan tudhatjuk, kik ezek a szerencsések?

Ehhez SQL-ben egyszerre két táblán hajthatunk végre egy lekérdezést. Általánosságban elmondható, hogy SQL-ben tetszőleges számú tábla lekérdezhető egyszerre. Az ilyen kérés általános formátuma:

SELECT columns
FROM Table 1, table 2, tableN

Fontos! Ha egyszerre több táblába ír le egy lekérdezést, akkor ennek eredményeként a táblázatsorok ún. Descartes-szorzatát kapjuk. Az első táblázat minden sora hozzá lesz ragasztva a második táblázat minden sorához, és így tovább.

Vagyis ha az első táblázatban 5 sor, a másodikban 10 sor van, akkor összesen 50 sora lesz. Java nyelven ez a lekérdezés valahogy így nézne ki:

for (String row1 : table1)
{
	for (String row2 : table2)
   {
  	System.out.println(row1 + row2);
   }
}

Írjuk le a lekérdezést egyszerre két táblába, és nézzük meg, mi történik:

SELECT * FROM employee, task

És ennek a lekérdezésnek az eredménye:

id név Foglalkozása fizetés kor id alkalmazott _id név határidő
1 Ivanov Iván Programozó 100 000 25 1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
2 Petrov Petr Programozó 80000 23 1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
3 Ivanov Szergej Vizsgáló 40000 harminc 1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
4 Rabinovics Moisa Rendező 200 000 35 1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
5 Kirienko Anasztázia Irodavezető 40000 25 1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
6 Vaska macska 1000 3 1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
1 Ivanov Iván Programozó 100 000 25 2 2 Javítson ki egy hibát a háttérben 2022-06-15
2 Petrov Petr Programozó 80000 23 2 2 Javítson ki egy hibát a háttérben 2022-06-15
3 Ivanov Szergej Vizsgáló 40000 harminc 2 2 Javítson ki egy hibát a háttérben 2022-06-15
4 Rabinovics Moisa Rendező 200 000 35 2 2 Javítson ki egy hibát a háttérben 2022-06-15
5 Kirienko Anasztázia Irodavezető 40000 25 2 2 Javítson ki egy hibát a háttérben 2022-06-15

Összesen 48 eredménysorunk van, de itt csak 11-et adtam meg. Ellenkező esetben egyszerűen nem lesz elég hely.

Három dologra figyelj:

  • Azonos nevű oszlopok: id . Ez az azonosító az alkalmazotti táblából és az azonosító a feladattáblából .
  • Az egyes táblázatok sorai ismétlődnek. A bal oldali oszlopban a 6. azonosítót ismét ID = 1 követi.
  • Vannak értelmetlen soraink, ahol például az id (az alkalmazotti táblából) 6, és ugyanabban a sorban az alkalmazott_id 1.

Értelmetlen sorok eltávolítása

Túl sok sor van az eredményül kapott táblánkban, amely az alkalmazott és a feladat két tábla összes sorának derékszögű szorzata.

Logikusan, ha az alkalmazotti_id sor 3, akkor csak az alkalmazotti tábla azon sorához kell ragaszkodnia, ahol az id 3. Próbáljuk meg kijavítani ezt a félreértést a WHERE-rel.

Írjunk egy ilyen lekérdezést:

SELECT * FROM employee, task 
WHERE emploee.id = task.emploee_id 

És ennek a lekérdezésnek az eredménye:

id név Foglalkozása fizetés kor id employee_id név határidő
1 Ivanov Iván Programozó 100 000 25 1 1 Javítson ki egy hibát a kezelőfelületen 2022-06-01
2 Petrov Petr Programozó 80000 23 2 2 Javítson ki egy hibát a háttérben 2022-06-15
4 Rabinovics Moisa Rendező 200 000 35 7 4 Élvezd az életet (NULLA)
5 Kirienko Anasztázia Irodavezető 40000 25 3 5 Vegyél kávét 2022-07-01
5 Kirienko Anasztázia Irodavezető 40000 25 4 5 Vegyél kávét 2022-08-01
5 Kirienko Anasztázia Irodavezető 40000 25 5 5 Kávét fog venni 2022-09-01
6 Vaska macska 1000 3 8 6 Élvezd az életet (NULLA)

A jó hír az, hogy az értelmetlen sorok eltűntek: az első oszlop azonosítója mindig egyenlő a munkavállalói_azonosítóval.

A rossz hír az, hogy a senkire nem kiosztott feladatok – például az iroda takarítása – megszűntek. Alkalmazotti azonosítójuk NULL volt, így a WHERE elvégzése után eldobták őket.