Questão nº 68
Questão de Tecnologia da Informação · FGV TRF1 2024 (nº 68)
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.a2
FROM T1 a
INNER JOIN T3 c ON c.id_A = a.id_A
WHERE COUNT(c.id_A) < = 5; - BSELECT a.id_A, a.a1, a.a2
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
GROUP BY a.a1, a.a2
HAVING COUNT(a.id_A) < = 5; - CSELECT COUNT(a.id_A), a.a1, a.a2
FROM T1 a
INNER JOIN T3 c ON c.id_A = a.id_A
WHERE a.id_A < = 5; - DSELECT 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; (alternativa correta) - ESELECT a.id_A, a.a1, a.a2
FROM T1 a
RIGHT OUTER JOIN T3 c ON c.id_A = a.id_A
GROUP BY a.id_A, a.a1, a.a2
HAVING COUNT(a.id_A) < = 5;
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) noSELECT. Além disso, a cláusulaWHEREnão pode ser usada para filtrar resultados de funções de agregação; para isso, usa-seHAVING. Armadilha da banca: UsarWHEREcomCOUNT()é um erro comum para iniciantes, poisWHEREfiltra linhas individuais antes da agregação, enquantoHAVINGfiltra 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. UsarT3 cduas vezes com o mesmo alias emJOINs diferentes é um erro. OGROUP BY a.a1, a.a2sema.id_AnoSELECTou noGROUP BYpode ser ambíguo dependendo do SGBD e da unicidade dea1, a2. - (C) Incorreta: Assim como na alternativa A, falta a cláusula
GROUP BY. Além disso, a condiçãoWHERE a.id_A <= 5filtra os registros deT1pelo valor doid_A, e não pela quantidade de relacionamentos, o que está incorreto para o objetivo da questão. - (D) Correta: Esta alternativa utiliza
INNER JOINpara conectarT1comT3, garantindo que apenas os registros deT1que possuem pelo menos um relacionamento comT2(viaT3) sejam considerados. OGROUP BY a.a1, a.a2agrupa os registros deT1por suas característicasa1ea2. OSELECT COUNT(a.id_A), a.*lista a contagem de relacionamentos e todos os dados deT1para cada grupo. A cláusulaHAVING COUNT(a.id_A) <= 5filtra esses grupos para incluir apenas aqueles que têm no máximo 5 relacionamentos. Como oINNER JOINjá garante pelo menos 1 relacionamento, a condição final é de 1 a 5 relacionamentos. (Nota: Em alguns SGBDs,SELECT a.*comGROUP BYparcial pode exigir quea.id_Atambém esteja noGROUP BYpara evitar ambiguidade, mas é uma extensão comum permitir isso quandoid_Aé a chave primária). - (E) Incorreta: O uso de
RIGHT OUTER JOINnão é adequado para esta questão, pois ele incluiria registros deT3que não têm correspondência emT1, o que não faz sentido para contar relacionamentos de T1. Para contar relacionamentos deT1, umINNER JOINouLEFT JOIN(se quisermos incluirT1sem relacionamentos) seria mais apropriado. Além disso, a condiçãoHAVING COUNT(a.id_A) <= 5não inclui a parte "pelo menos 1" de forma explícita, embora oCOUNT(a.id_A)paraT1sem 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.