Seotud tabelitest andmete hankimine Pythonis

Teeme päringu, mis toob kõik kasutajad koos nende linnadega. Selleks on vaja käsku LEFT JOIN:

Selle süntaks on järgmine:

sqlSELECT väljad FROM tabeli_nimi
  LEFT JOIN seotud_tabeli_nimi ON seosingutingimus
WHERE valikutingimus

Vaatame üksikuid osi selle käsu süntaksist.

Väljad

Kuna valik tehakse mitmest tabelist, siis kõigi väljade valimine läbi * ei toimi. Järgmine päring valib väljad ainult põhitabelist, mitte seotud tabelist:

sqlSELECT *

Selleks, et andmeid valitakse kõigist tabelitest, tuleb enne * määrata tabeli nimi valimiseks:

sqlSELECT users.*, cities.*

Või saab loetleda vajalikud väljad koos tabeli nime määramisega nende ees:

sqlSELECT users.name, cities.name

Neil kahel viisil on probleem. Asi on selles, et kui väljad tabelites on identsete nimedega, siis Pythoni massiivis tekib nimetuste konflikt ja ainult üks väljadest jääb alles, teist ei ole.

Probleemi lahendamiseks tuleb konfliktseid nimesid ümber nimetada läbi käsu as:

sqlSELECT users.name, cities.name as city_name

Seos

Pärast käsku ON peame määrama kaks välja kahest tabelist, mille kaudu seos toimub. Meie puhul on see väli id linnade tabelist ja väli city_id kasutajate tabelist:

sqlON cities.id=users.city_id

Päring

Lõppkokkuvõttes näeb päring, mis toob kasutajad koos nende linnadega välja järgmine:

sqlSELECT
  users.name, cities.name as city_name
FROM
  users
LEFT JOIN cities ON cities.id=users.city_id

Praktilised ülesanded

Задание 1

Oletame, et teil on tabel toodetega ja tabel nende kategooriatega. Kirjutage päring, mis toob toodete nimed koos nende kategooriatega.