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.