Problém:
Chcete spojit tabulky ve více sloupcích pomocí primárního složeného klíče v jedné tabulce a cizího složeného klíče v jiné.
Příklad:
Naše databáze má tři tabulky s názvem student
, enrollment
a payment
. student
tabulka obsahuje data v následujících sloupcích:id
(primární klíč), first_name
a last_name
.
id | křestní_jméno | last_name |
---|---|---|
1 | Ellie | Willson |
2 | Tome | Hnědá |
3 | Sandra | Miller |
enrollment
tabulka obsahuje data v následujících sloupcích:primární klíč (student_id
a course_code
), is_active
a start_date
.
id_studenta | kurzový_kód | je_aktivní | počáteční_datum |
---|---|---|---|
1 | GD03 | pravda | 20. 1. 2020 |
1 | AP01 | false | 2020-03-10 |
2 | SL01 | pravda | 2020-05-05 |
3 | SL01 | pravda | 2020-06-01 |
payment
tabulka obsahuje data v následujících sloupcích:cizí klíč (student_id
a course_code
, primární klíče enrollment
tabulka), status
a amount
.
id_studenta | kurzový_kód | stav | částka |
---|---|---|---|
1 | GD03 | zaplaceno | 230 |
1 | AP01 | nevyřízeno | 100 |
2 | SL01 | nevyřízeno | 80 |
3 | SL01 | nevyřízeno | 110 |
Ukážeme každému studentovi jméno, kód kurzu a stav platby a částku.
Řešení:
SELECT s.last_name, s.first_name, p.course_code, p.status, p.amount FROM enrollment e JOIN student s ON s.id=e.student_id JOIN payment p ON p.course_code=e.course_code AND p.student_id=e.student_id;
last_name | křestní_jméno | kurzový_kód | stav | částka |
---|---|---|---|---|
Willson | Ellie | GD03 | zaplaceno | 230 |
Willson | Ellie | AP01 | nevyřízeno | 100 |
Hnědá | Tome | SL01 | nevyřízeno | 80 |
Miller | Sandra | SL01 | nevyřízeno | 110 |
Diskuse:
Pokud chcete získat data uložená v tabulkách spojených složeným klíčem, který je primárním klíčem v jedné tabulce a cizím klíčem v jiné tabulce, jednoduše použijte podmínku spojení pro více sloupců.
V jedné spojené tabulce (v našem příkladu enrollment
), máme primární klíč vytvořený ze dvou sloupců (student_id
a course_code
). Ve druhé tabulce (payment
), máme sloupce, které jsou cizím složeným klíčem (student_id
a course_code
). Jak můžeme spojit tabulky pomocí těchto složených klíčů?
Snadný! Potřebujeme pouze použít JOIN
klauzuli s více než jednou podmínkou pomocí operátoru AND za první podmínkou. V našem příkladu použijeme tuto podmínku:
p.course_code=e.course_code AND p.student_id=e.student_id
V první části používáme student_id
ze sloupce enrollment
tabulka a student_id
z payment
stůl. V další podmínce získáme course_code
ze sloupce enrollment
tabulka a course_code
z payment
tabulka.
Všimněte si, že student_id
a course_code
sloupce tvoří primární klíč v enrollment
stůl. Proto se používají při payment
tabulka jako cizí klíč.