Considere os comandos SQL a seguir. create table TT1(A int ...
create table TT1(A int not null primary key); create table TT2(B int foreign key references TT1(A), C int not null); select * from TT1 left join TT2 on TT1.A = TT2.B;
Dado que TT1 e TT2 contêm, respectivamente, 100 e 150 linhas, assinale as expressões que apresentam, na ordem, os números mínimo e máximo de linhas que podem ser produzidas pela execução do comando SELECT, fora a linha de títulos.
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: B - 100 e 249
Vamos entender por que a alternativa B é a correta e explorar os conceitos de JOIN e cardinalidade em SQL.
Primeiramente, os comandos SQL apresentados criam duas tabelas:
- TT1, com uma coluna A que é a chave primária.
- TT2, com uma coluna B que é uma chave estrangeira referenciando TT1(A) e uma coluna C.
O comando SELECT realiza um LEFT JOIN, que retorna todas as linhas da tabela da esquerda (TT1), e as linhas correspondentes da tabela da direita (TT2). Se não houver correspondência, os resultados da tabela da direita serão NULL.
Considerando que TT1 tem 100 linhas e TT2 tem 150 linhas, vamos analisar os cenários mínimo e máximo:
Número mínimo de linhas:
O LEFT JOIN garante que todas as linhas de TT1 aparecerão no resultado. Portanto, o número mínimo de linhas será igual ao número de linhas de TT1, que é 100.
Número máximo de linhas:
No pior cenário, cada linha de TT1 pode se juntar a várias linhas de TT2. Como TT2 tem 150 linhas, e se considerarmos que pode haver até uma linha em TT2 para cada linha em TT1 e mais uma linha extra para cada linha não correspondida, o número máximo de linhas seria 100 (de TT1) + 149 (no pior cenário, até 149 correspondências para uma das 100 linhas) = 249.
Portanto, a alternativa correta é a B - 100 e 249.
Justificativa das alternativas incorretas:
A - 100 e 150: Incorreta porque o número máximo de linhas pode ser maior que 150, considerando o LEFT JOIN.
C - 100 e 250: Incorreta porque o valor máximo de linhas não pode exceder 249, de acordo com nossas análises de JOIN.
D - 150 e 249: Incorreta porque o número mínimo de linhas é 100, não 150.
E - 250 e 15000: Incorreta porque os valores são irreais para este contexto de JOIN e cardinalidade das tabelas.
Espero que isso tenha esclarecido a questão! Se precisar de mais alguma explicação, não hesite em perguntar.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
O número mínimo de linhas ocorre quando o LEFT JOIN coincide com o (INNER) JOIN, ou seja, há pelo menos uma correspondência de cada valor de TT1.A em TT1.B, resultando em 100 linhas. Segue um exemplo resumido:
TT1
a|
-+
1|
2|
3|
.
TT2
b|c|
-+-+
1|1|
1|2|
1|3|
.
select * from TT1 left join TT2 on TT1.A = TT2.B
a|b|c|
-+-+-+
1|1|1|
1|1|2|
1|1|3|
2| | |
3| | |
.
Porém para o número máximo, devemos olhar para o pior caso, ou seja, quando todas as referências de TT2.B forem para a mesma linha de TT1.A, resultando COUNT(TT1)+(COUNT(TT2)-1:
.
TT1 -- 10 registros
a |
--+
1|
2|
3|
4|
5|
6|
7|
8|
9|
10|
.
TT2 -- 15 registros
b|c |
-+--+
1| 2|
1| 3|
1| 4|
1| 5|
1| 6|
1| 7|
1| 8|
1| 9|
1|10|
1|11|
1|12|
1|13|
1|14|
1|15|
.
select * from TT1 left join TT2 on TT1.A = TT2.B -- 24 registros
.
a |b|c |
--+-+--+
1|1| 2|
1|1| 3|
1|1| 4|
1|1| 5|
1|1| 6|
1|1| 7|
1|1| 8|
1|1| 9|
1|1|10|
1|1|11|
1|1|12|
1|1|13|
1|1|14|
1|1|15|
6| | |
5| | |
9| | |
10| | |
8| | |
7| | |
2| | |
4| | |
3| | |
.
Gabarito: B
Se TT2.B é chave estrangeira de TT1.A e TT1.A não pode ser nulo, então todo registro de TT2 tem q mapear pra um registro de TT1. Sendo assim, ao meu ver, esse join geraria no mínimo o número de registro da maior tabela, a tabela com mais registros. Nesse caso seria a tabela TT2 com 150 registros.
exemplo
TT1
a|
1|
2|
TT2
b| c|
1|1|
1|2|
2|1|
2|2|
select * from TT1 left join TT2 on TT1.A = TT2.B
a|b|c|
1|1|1|
1|1|2|
2|2|1|
2| 2| 2|
Nesse caso, ele gera 4 registros que seria a quantidade de registro da tabela TT2 q é a maior.
ou seja, pra mim faz sentido q seja resposta D
Repare que uma chave FK pode ser nula. então.. para dar o mínimo seria o caso de todas fk de tt2 serem nulas, 100. para dar o maximo seria o caso de todas as Fk apontarem para um elemento (ex primeira linha) de TT1, então teríamos 150 linhas referentes a essa primeira linha de TT1 e as demais 99 de TT1 tbm precisariam ser listadas já que é um left Join. totalizando 249 como o máximo
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo