Vấn đề:
Bạn muốn nối các bảng trên nhiều cột bằng cách sử dụng khóa ghép chính trong một bảng và khóa ghép ngoại trong một bảng khác.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có ba bảng có tên student
, enrollment
và payment
. student
bảng có dữ liệu trong các cột sau:id
(khóa chính), first_name
và last_name
.
id | first_name | last_name |
---|---|---|
1 | Ellie | Willson |
2 | Tom | Màu nâu |
3 | Sandra | Miller |
enrollment
bảng có dữ liệu trong các cột sau:khóa chính (student_id
và course_code
), is_active
và start_date
.
student_id | course_code | is_active | start_date |
---|---|---|---|
1 | GD03 | đúng | 2020-01-20 |
1 | AP01 | sai | 2020-03-10 |
2 | SL01 | đúng | 2020-05-05 |
3 | SL01 | đúng | 2020-06-01 |
payment
bảng có dữ liệu trong các cột sau:khóa ngoại (student_id
và course_code
, các khóa chính của enrollment
bảng), status
và amount
.
student_id | course_code | trạng thái | số lượng |
---|---|---|---|
1 | GD03 | trả tiền | 230 |
1 | AP01 | đang chờ xử lý | 100 |
2 | SL01 | đang chờ xử lý | 80 |
3 | SL01 | đang chờ xử lý | 110 |
Hãy hiển thị tên, mã khóa học, trạng thái và số tiền thanh toán của từng học viên.
Giải pháp:
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 | first_name | course_code | trạng thái | số lượng |
---|---|---|---|---|
Willson | Ellie | GD03 | trả tiền | 230 |
Willson | Ellie | AP01 | đang chờ xử lý | 100 |
Màu nâu | Tom | SL01 | đang chờ xử lý | 80 |
Miller | Sandra | SL01 | đang chờ xử lý | 110 |
Thảo luận:
Nếu bạn muốn nhận dữ liệu được lưu trữ trong các bảng được nối bằng khóa ghép là khóa chính trong một bảng và khóa ngoại trong bảng khác, chỉ cần sử dụng điều kiện nối trên nhiều cột.
Trong một bảng đã kết hợp (trong ví dụ của chúng tôi, enrollment
), chúng tôi có một khóa chính được tạo từ hai cột (student_id
và course_code
). Trong bảng thứ hai (payment
), chúng tôi có các cột là khóa ghép ngoại (student_id
và course_code
). Làm cách nào chúng ta có thể nối các bảng với các khóa ghép này?
Dễ dàng! Chúng tôi chỉ cần sử dụng JOIN
mệnh đề có nhiều hơn một điều kiện bằng cách sử dụng toán tử AND sau điều kiện đầu tiên. Trong ví dụ của chúng tôi, chúng tôi sử dụng điều kiện này:
p.course_code=e.course_code AND p.student_id=e.student_id
Trong phần đầu tiên, chúng tôi sử dụng student_id
từ enrollment
bảng và student_id
từ payment
bàn. Trong điều kiện tiếp theo, chúng ta nhận được course_code
từ enrollment
bảng và course_code
từ payment
bảng.
Lưu ý rằng student_id
và course_code
các cột tạo thành khóa chính trong enrollment
bàn. Do đó, chúng được sử dụng trong payment
bảng làm khóa ngoại.