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:
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;
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;
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;
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;
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.
1INNER JOIN T1 × T3
2GROUP BY (a1, a2)
3COUNT(id_A) por grupo
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.