Problem:
Chcesz połączyć tabele w wielu kolumnach, używając podstawowego klucza złożonego w jednej tabeli i obcego klucza złożonego w drugiej.
Przykład:
Nasza baza danych zawiera trzy tabele o nazwie student
, enrollment
i payment
. student
tabela zawiera dane w następujących kolumnach:id
(klucz podstawowy), first_name
i last_name
.
id | imię | nazwisko |
---|---|---|
1 | Elia | Willson |
2 | Tomek | Brązowy |
3 | Sandra | Młynarz |
enrollment
tabela zawiera dane w następujących kolumnach:klucz podstawowy (student_id
i course_code
), is_active
i start_date
.
identyfikator studenta | kod_kursu | jest_aktywny | data_początkowa |
---|---|---|---|
1 | GD03 | prawda | 2020-01-20 |
1 | AP01 | fałsz | 2020-03-10 |
2 | SL01 | prawda | 2020-05-05 |
3 | SL01 | prawda | 2020-06-01 |
payment
tabela zawiera dane w następujących kolumnach:klucz obcy (student_id
i course_code
, klucze podstawowe enrollment
tabela), status
i amount
.
identyfikator studenta | kod_kursu | stan | kwota |
---|---|---|---|
1 | GD03 | płatne | 230 |
1 | AP01 | oczekujące | 100 |
2 | SL01 | oczekujące | 80 |
3 | SL01 | oczekujące | 110 |
Pokażmy imię i nazwisko każdego ucznia, kod kursu oraz status i kwotę płatności.
Rozwiązanie:
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;
nazwisko | imię | kod_kursu | stan | kwota |
---|---|---|---|---|
Willson | Elia | GD03 | płatne | 230 |
Willson | Elia | AP01 | oczekujące | 100 |
Brązowy | Tomek | SL01 | oczekujące | 80 |
Młynarz | Sandra | SL01 | oczekujące | 110 |
Dyskusja:
Jeśli chcesz, aby dane przechowywane w tabelach były połączone kluczem złożonym, który jest kluczem podstawowym w jednej tabeli i kluczem obcym w innej tabeli, po prostu użyj warunku łączenia w wielu kolumnach.
W jednej połączonej tabeli (w naszym przykładzie enrollment
), mamy klucz podstawowy zbudowany z dwóch kolumn (student_id
i course_code
). W drugiej tabeli (payment
), mamy kolumny, które są obcym kluczem złożonym (student_id
i course_code
). Jak możemy połączyć tabele za pomocą tych kluczy złożonych?
Łatwo! Wystarczy użyć JOIN
klauzula z więcej niż jednym warunkiem przy użyciu operatora AND po pierwszym warunku. W naszym przykładzie używamy tego warunku:
p.course_code=e.course_code AND p.student_id=e.student_id
W pierwszej części używamy student_id
kolumna z enrollment
table i student_id
z payment
stół. W następnym warunku otrzymujemy course_code
kolumna z enrollment
table i course_code
z payment
tabela.
Zwróć uwagę, że student_id
i course_code
kolumny tworzą klucz podstawowy w enrollment
stół. Dlatego są używane w payment
tabela jako klucz obcy.