Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2024

Banco de DadosSQL
Código
fg101861
Banca
FGV
Órgão
TRF - 1ª REGIÃO
Ano
2024
Nível
Superior
Cargo
Técnico Judiciário - Área Administrativa - Especialidade: Tecnologia da Informação
Maria executou as seguintes instruções em SQL para criação de tabelas:CREATE TABLE T1 (id_A INT,a1 CHAR(10),a2 CHAR(10));CREATE TABLE T2 (id_B INT,b1 CHAR(10),b2 CHAR(10));CREATE TABLE T3 (id_A INT,id_B INT,c1 CHAR(10),c2 CHAR(10));Maria deseja listar a quantidade e os respectivos dados de T1 que possuem pelo menos 1 e no máximo 5 relacionamentos com T2.Para isso, ela deve utilizar a instrução:
  1. ASELECT COUNT(c.id_A), a.a1, a.a2FROM T1 aINNER JOIN T3 c ON c.id_A = a.id_AWHERE COUNT(c.id_A) < = 5;
  2. BSELECT a.id_A, a.a1, a.a2FROM T1 a, T2 bLEFT OUTER JOIN T3 c ON c.id_A = a.id_ALEFT OUTER JOIN T3 c ON c.id_B = b.id_BGROUP BY a.a1, a.a2HAVING COUNT(a.id_A) < = 5;
  3. CSELECT COUNT(a.id_A), a.a1, a.a2FROM T1 aINNER JOIN T3 c ON c.id_A = a.id_AWHERE a.id_A < = 5;
  4. DSELECT COUNT(a.id_A), a.*FROM T1 aINNER JOIN T3 c ON c.id_A = a.id_AGROUP BY a.a1, a.a2HAVING COUNT(a.id_A) < = 5;
  5. ESELECT a.id_A, a.a1, a.a2FROM T1 aRIGHT OUTER JOIN T3 c ON c.id_A = a.id_AGROUP BY a.id_A, a.a1, a.a2HAVING COUNT(a.id_A) < = 5;
Revelar gabarito e comentário

GabaritoD — SELECT COUNT(a.id_A), a.* FROM T1 a INNER JOIN T3 c ON c.id_A = a.id_A GROUP BY a.a1, a.a2 HAVING COUNT(a.id_A) < = 5;

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

SQL: Agrupamento com HAVING e contagem de relacionamentos

Gabarito: letra D. A consulta correta usa INNER JOIN entre T1 e T3 (garantindo apenas registros com pelo menos um relacionamento), agrupa por a.a1, a.a2 (que identificam cada linha de T1) e filtra com HAVING COUNT(a.id_A) <= 5 para limitar a no máximo 5. Como o INNER JOIN já exclui T1 sem relacionamentos, a condição "pelo menos 1" é satisfeita implicitamente.

O problema pede listar a quantidade de relacionamentos de cada registro de T1 com T2 (via tabela associativa T3) e os próprios dados de T1, restringindo a registros que tenham entre 1 e 5 relacionamentos. A solução envolve:

  • JOIN entre T1 e T3 para obter cada par relacionado.

  • GROUP BY pelas colunas que identificam cada registro de T1 (aqui a1, a2).

  • COUNT no agrupamento para contar quantas linhas de T3 (relacionamentos) existem para cada T1.

  • HAVING para aplicar a condição sobre a contagem.

  1. 1INNER JOIN T1 × T3
  2. 2GROUP BY (a1, a2)
  3. 3COUNT(id_A) por grupo
  4. 4HAVING COUNT <= 5
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Usa WHERE COUNT(c.id_A) <= 5. A cláusula WHERE não aceita funções de agregação; o correto seria HAVING. Além disso, não há GROUP BY, então o COUNT seria sobre toda a tabela, não por registro.

Alternativa B — ❌ Incorreta

A sintaxe é inválida: FROM T1 a, T2 b (produto cartesiano) seguido de duas cláusulas LEFT OUTER JOIN com a mesma alias c. Não é possível usar duas cláusulas JOIN independentes com o mesmo alias. A lógica de contagem também está incorreta.

Alternativa C — ❌ Incorreta

Filtra por WHERE a.id_A <= 5, que é uma condição sobre o valor do id_A, não sobre a quantidade de relacionamentos. Não atende ao requisito.

Alternativa D — ✅ Correta ⟵ GABARITO

Faz INNER JOIN entre T1 e T3, que retorna apenas registros de T1 que possuem ao menos um relacionamento. Agrupa por a.a1, a.a2 (supondo que essas colunas identificam unicamente cada linha de T1; caso contrário, deveria ser por id_A). Aplica HAVING COUNT(a.id_A) <= 5. Como o INNER JOIN já exclui registros sem relacionamentos, a contagem mínima é 1, atendendo "pelo menos 1". A alternativa lista COUNT(a.id_A) e a.* (todos os dados de T1), conforme solicitado.

Alternativa E — ❌ Incorreta

Usa RIGHT OUTER JOIN de T3 para T1. Isso pode incluir linhas de T3 sem correspondência em T1, onde a.id_A seria NULL. Nesse caso, o COUNT(a.id_A) seria 0 (pois NULL não é contado) e o GROUP BY por a.id_A agruparia esses NULLs, resultando em uma linha indesejada com contagem 0. Além disso, a condição HAVING <=5 aceitaria essa linha, o que é errado. O RIGHT JOIN não é apropriado para garantir pelo menos um relacionamento.

Gabarito: letra D.

Link permanente: /questoes/fg101861