Questão nº 68

Questão de Tecnologia da Informação · FGV TRF1 2024 (nº 68)

FGV2024Técnico Judiciário - Tecnologia da InformaçãoTecnologia da Informação
Gabarito: Dver comentário ↓

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:

Resposta comentada

Gabarito Alternativa D

Para listar e filtrar dados com base em contagens de relacionamentos, precisamos agrupar os dados e usar a cláusula HAVING para filtrar esses grupos. A cláusula INNER JOIN é usada para conectar tabelas e garantir que apenas registros com pelo menos um relacionamento sejam considerados.

  • (A) Incorreta: Não inclui a cláusula GROUP BY, que é necessária ao usar funções de agregação (COUNT) com colunas não agregadas (a.a1, a.a2) no SELECT. Além disso, a cláusula WHERE não pode ser usada para filtrar resultados de funções de agregação; para isso, usa-se HAVING. Armadilha da banca: Usar WHERE com COUNT() é um erro comum para iniciantes, pois WHERE filtra linhas individuais antes da agregação, enquanto HAVING filtra grupos após a agregação.
  • (B) Incorreta: A sintaxe FROM T1 a, T2 b LEFT OUTER JOIN T3 c ON c.id_A = a.id_A LEFT OUTER JOIN T3 c ON c.id_B = b.id_B é confusa e provavelmente incorreta. Usar T3 c duas vezes com o mesmo alias em JOINs diferentes é um erro. O GROUP BY a.a1, a.a2 sem a.id_A no SELECT ou no GROUP BY pode ser ambíguo dependendo do SGBD e da unicidade de a1, a2.
  • (C) Incorreta: Assim como na alternativa A, falta a cláusula GROUP BY. Além disso, a condição WHERE a.id_A <= 5 filtra os registros de T1 pelo valor do id_A, e não pela quantidade de relacionamentos, o que está incorreto para o objetivo da questão.
  • (D) Correta: Esta alternativa utiliza INNER JOIN para conectar T1 com T3, garantindo que apenas os registros de T1 que possuem pelo menos um relacionamento com T2 (via T3) sejam considerados. O GROUP BY a.a1, a.a2 agrupa os registros de T1 por suas características a1 e a2. O SELECT COUNT(a.id_A), a.* lista a contagem de relacionamentos e todos os dados de T1 para cada grupo. A cláusula HAVING COUNT(a.id_A) <= 5 filtra esses grupos para incluir apenas aqueles que têm no máximo 5 relacionamentos. Como o INNER JOIN já garante pelo menos 1 relacionamento, a condição final é de 1 a 5 relacionamentos. (Nota: Em alguns SGBDs, SELECT a.* com GROUP BY parcial pode exigir que a.id_A também esteja no GROUP BY para evitar ambiguidade, mas é uma extensão comum permitir isso quando id_A é a chave primária).
  • (E) Incorreta: O uso de RIGHT OUTER JOIN não é adequado para esta questão, pois ele incluiria registros de T3 que não têm correspondência em T1, o que não faz sentido para contar relacionamentos de T1. Para contar relacionamentos de T1, um INNER JOIN ou LEFT JOIN (se quisermos incluir T1 sem relacionamentos) seria mais apropriado. Além disso, a condição HAVING COUNT(a.id_A) <= 5 não inclui a parte "pelo menos 1" de forma explícita, embora o COUNT(a.id_A) para T1 sem relacionamentos seria 0, que seria excluído pela condição.

Fonte: FGV TRF1 2024 Técnico Judiciário - Tecnologia da Informação (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho