Problema:
Desea unir tablas en varias columnas usando una clave compuesta principal en una tabla y una clave compuesta externa en otra.
Ejemplo:
Nuestra base de datos tiene tres tablas llamadas student , enrollment y payment . El student la tabla tiene datos en las siguientes columnas:id (clave principal), first_name y last_name .
| id | nombre | apellido |
|---|---|---|
| 1 | Ellie | Willson |
| 2 | Tom | Marrón |
| 3 | Sandra | Molinero |
La enrollment la tabla tiene datos en las siguientes columnas:clave principal (student_id y course_code ), is_active y start_date .
| student_id | código_del_curso | es_activo | fecha_inicio |
|---|---|---|---|
| 1 | GD03 | verdadero | 2020-01-20 |
| 1 | AP01 | falso | 2020-03-10 |
| 2 | SL01 | verdadero | 2020-05-05 |
| 3 | SL01 | verdadero | 2020-06-01 |
El payment la tabla tiene datos en las siguientes columnas:clave externa (student_id y course_code , las claves primarias de la enrollment tabla), status y amount .
| student_id | código_del_curso | estado | cantidad |
|---|---|---|---|
| 1 | GD03 | pagado | 230 |
| 1 | AP01 | pendiente | 100 |
| 2 | SL01 | pendiente | 80 |
| 3 | SL01 | pendiente | 110 |
Mostremos el nombre de cada estudiante, el código del curso y el estado y monto del pago.
Solución:
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;
| apellido | nombre | código_del_curso | estado | cantidad |
|---|---|---|---|---|
| Willson | Ellie | GD03 | pagado | 230 |
| Willson | Ellie | AP01 | pendiente | 100 |
| Marrón | Tom | SL01 | pendiente | 80 |
| Molinero | Sandra | SL01 | pendiente | 110 |
Discusión:
Si desea que los datos almacenados en tablas se unan mediante una clave compuesta que es una clave principal en una tabla y una clave externa en otra tabla, simplemente use una condición de unión en varias columnas.
En una tabla unida (en nuestro ejemplo, enrollment ), tenemos una clave principal construida a partir de dos columnas (student_id y course_code ). En la segunda tabla (payment ), tenemos columnas que son una clave compuesta externa (student_id y course_code ). ¿Cómo podemos unir las tablas con estas claves compuestas?
¡Fácil! Solo necesitamos usar un JOIN cláusula con más de una condición usando el operador AND después de la primera condición. En nuestro ejemplo, usamos esta condición:
p.course_code=e.course_code AND p.student_id=e.student_id
En la primera parte, usamos el student_id columna de la enrollment tabla y student_id del payment mesa. En la siguiente condición, obtenemos el course_code columna de la enrollment tabla y course_code del payment mesa.
Tenga en cuenta que el student_id y course_code las columnas forman una clave principal en la enrollment mesa. Por lo tanto, se utilizan en el payment tabla como clave externa.