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.