Vastus (18.01.2024 01:00): See muudab keerulisemaks tabelites olevatest andmetest arusaamise ja tabelite põhjal päringute tegemise.
Sellise nimega primaarvõtme veerud on üks sümptom, mis viitab sellele, et andmebaasi disainis esineb
"Üks suurus kõigile" andmebaasi disaini antimuster. Antimuster on struktuurse kirjutamise viis, kuidas panna kirja halbu lahendusi levinud probleemidele.
Selline nimi on liiga üldine ja tuleb päringute tulemuses enamasti ümber nimetada. Vastasel juhul tekib päringu tulemusse mitu sama nimega veergu, mis vormiliselt on küll SQLis lubatud, kuid sisuliselt muudab see päringu tulemuse raskesti kasutatavaks.
Oletame, et andmebaasis on tabelid:
Mark (
id, nimetus)
Primaarvõti (id)
Auto (
id, mark_id, registri_nr)
Primaarvõti (id)
Välisvõti (mark_id) Viitab Mark (id)
Kui ülesandeks on leida iga auto kohta margi identifikaator, nimetus, auto identifikaator ja registri number, siis tuleks kirjutada päring
SELECT Mark.id AS mark_id, nimetus, Auto.id AS auto_id, registri_nr
FROM Mark INNER JOIN Auto ON Mark.id=Auto.mark_id;
Samas, kui andmebaasis oleksid tabelid:
Mark (mark_id, nimetus)
Primaarvõti (mark_id)
Auto (auto_id, mark_id, registri_nr)
Primaarvõti (auto_id)
Välisvõti (mark_id) Viitab Mark (mark_id)
, siis saab selle ülesande lahendada SQL standardit hästi järgivas andmebaasisüsteemis (nt PostgreSQL) oluliselt lühema lausega. USING võimaldab teha ühendamist üle samanimeliste veergude. Ühendamise tulemuses on see veerg (antud juhul
mark_id) ühekordselt, st SELECT klauslis pole veeru nime ees vaja täpsustada tabeli nime.
SELECT mark_id, nimetus, auto_id, registri_nr
FROM Mark INNER JOIN Auto USING (mark_id);