Considere os comandos SQL a seguir. create table TT1(A int ...

Próximas questões
Com base no mesmo assunto
Q2287686 Banco de Dados
Considere os comandos SQL a seguir.

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.
Alternativas

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