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.