Hai mã của một bản thu dẫn tới đâu?
Một hàng `banthuam` chỉ lưu `idBanthuam`, `idBannhac`, `idCasi`. Tên bài ở `bannhac`; tên ca sĩ ở `casi`. Vì vậy cần hai đường nối: `banthuam.idBannhac = bannhac.idBannhac` và `banthuam.idCasi = casi.idCasi`. Nối theo mã **bản thu** với mã bài, hoặc nối tên bài với mã ca sĩ đều sai ý nghĩa.
Ví dụ bản thu mã1 gắn bài mã1 và ca sĩ mã1: tra hai bảng cha ra “Mưa đầu mùa” và “Linh Chi”. Bản thu mã2 gắn cùng bài mã1 nhưng ca sĩ mã2: kết quả vẫn là “Mưa đầu mùa” song ca sĩ “Quang Minh”. Một bài có thể xuất hiện ở nhiều bản thu; đừng coi hàng kết quả lặp tên bài là lỗi.
Viết hai JOIN liền nhau
Chạy trên CSDL thử:
```sql
SELECT r.idBanthuam, b.tenBannhac, c.tenCasi
FROM banthuam AS r
INNER JOIN bannhac AS b
ON r.idBannhac = b.idBannhac
INNER JOIN casi AS c
ON r.idCasi = c.idCasi
ORDER BY r.idBanthuam;
```
Máy thử trả ba hàng: bản thu1/Mưa đầu mùa/Linh Chi, bản thu2/Mưa đầu mùa/Quang Minh, bản thu6/Ngày nắng/Linh Chi. Mã6 không cho biết đó là bản thu thứ sáu đang có; ID tự tăng có thể có khoảng trống. Nếu dữ liệu của mình khác, đối chiếu từng mã ở `banthuam` với hai bảng cha. Tên nhạc sĩ **chưa có** trong ba bảng của câu này; muốn hiện thêm thì cần nối `nhacsi` qua `bannhac`, ở bài tiếp.
Bài luyện
Trong câu nối banthuam, bannhac và casi, đường nào lấy tên ca sĩ?
Mã ca sĩ của bản thu nối với khóa chính casi.
Mã bài không định danh ca sĩ.
Hai tên không là mã liên kết.
Mã bản thu định danh bản thu.
Lời giải
Dùng idCasi trong banthuam để tra đúng hàng ca sĩ ở casi.
Bài luyện
Hai bản thu khác nhau cùng có idBannhac = 1 nhưng idCasi = 1 và 2. Kết quả JOIN ba bảng có thể thế nào?
Một bài có thể gắn hai ca sĩ ở hai bản thu.
JOIN không tự gộp hai bản thu.
idCasi khác nhau dẫn tới hai ca sĩ.
Mã bài được phép lặp trong banthuam.
Lời giải
JOIN giữ hai hàng bản thu; tên bài lặp hợp lí, còn tên ca sĩ theo idCasi của từng hàng.
Bài luyện
Câu SELECT ba bảng trên chưa có tenNhacsi. Vì sao?
SELECT có thể hiện tên nếu truy vấn đúng bảng/cột.
Tên nhạc sĩ nằm ở bảng thứ tư.
JOIN không xóa bảng khác.
ORDER BY không giới hạn như vậy.
Lời giải
Muốn có tên nhạc sĩ, nối thêm nhacsi qua bannhac.idNhacsi và chọn n.tenNhacsi.
Đang học