Problema:
Você deseja unir tabelas em várias colunas usando uma chave composta primária em uma tabela e uma chave composta estrangeira em outra.
Exemplo:
Nosso banco de dados tem três tabelas chamadas
student , enrollment e payment . O student tabela tem dados nas seguintes colunas:id (chave primária), first_name e last_name . | id | first_name | last_name |
|---|---|---|
| 1 | Ellie | Wilson |
| 2 | Tom | Marrom |
| 3 | Sandra | Moleiro |
A
enrollment tabela tem dados nas seguintes colunas:chave primária (student_id e course_code ), is_active e start_date . | id_aluno | course_code | is_ativo | data_inicial |
|---|---|---|---|
| 1 | GD03 | verdadeiro | 20-01-2020 |
| 1 | AP01 | falso | 2020-03-10 |
| 2 | SL01 | verdadeiro | 2020-05-05 |
| 3 | SL01 | verdadeiro | 2020-06-01 |
O
payment tabela tem dados nas seguintes colunas:chave estrangeira (student_id e course_code , as chaves primárias da enrollment tabela), status e amount . | id_aluno | course_code | estado | quantidade |
|---|---|---|---|
| 1 | GD03 | pago | 230 |
| 1 | AP01 | pendente | 100 |
| 2 | SL01 | pendente | 80 |
| 3 | SL01 | pendente | 110 |
Vamos mostrar o nome de cada aluno, o código do curso, o status e o valor do pagamento.
Solução:
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 | estado | quantidade |
|---|---|---|---|---|
| Wilson | Ellie | GD03 | pago | 230 |
| Wilson | Ellie | AP01 | pendente | 100 |
| Marrom | Tom | SL01 | pendente | 80 |
| Moleiro | Sandra | SL01 | pendente | 110 |
Discussão:
Se você deseja obter dados armazenados em tabelas unidas por uma chave composta que é uma chave primária em uma tabela e uma chave estrangeira em outra tabela, basta usar uma condição de junção em várias colunas.
Em uma tabela unida (no nosso exemplo,
enrollment ), temos uma chave primária construída a partir de duas colunas (student_id e course_code ). Na segunda tabela (payment ), temos colunas que são uma chave composta estrangeira (student_id e course_code ). Como podemos unir as tabelas com essas chaves compostas? Fácil! Só precisamos usar um
JOIN cláusula com mais de uma condição usando o operador AND após a primeira condição. Em nosso exemplo, usamos esta condição:p.course_code=e.course_code AND p.student_id=e.student_id Na primeira parte, usamos o
student_id coluna da enrollment tabela e student_id do payment tabela. Na próxima condição, obtemos o course_code coluna da enrollment tabela e course_code do payment tabela. Observe que o
student_id e course_code colunas formam uma chave primária no enrollment tabela. Portanto, eles são usados no payment tabela como chave estrangeira.