Auditor Federal de Finanças e Controle - Área de Tecnologia da Informação (Operação e Infraestrutura) - manhã
Considere que um erro de programa na manipulação da tabela IPCA apresentada produziu a inserção de registros duplicados, de modo que algumas linhas da tabela ficaram com valores idênticos em suas colunas.Analise as alternativas SQL que foram consideradas para a remoção das linhas redundantes.I. Utilizar o comando delete com a cláusula except one.II. Utilizar o comando delete incluindo a cláusula exists, o que faria com que a última linha de cada grupo de repetições não seria removida uma vez que não mais existiria uma outra linha idêntica.III. Introduzir, temporariamente, uma nova coluna na tabela, com valores gerados por meio de um mecanismo de auto increment, ou sequence, e utilizar o uso do comando delete incluindo a cláusula exists.Em relação a essas alternativas, é correto afirmar que
Anenhuma funcionaria.
Btodas funcionariam.
Csomente I funcionaria.
Dsomente II funcionaria.
Esomente III funcionaria.
Revelar gabarito e comentário▾
GabaritoE — somente III funcionaria.
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”.
SE LIGUE NESSA!
Esta questão depende de conhecimento sobre remoção de duplicatas em SQL padrão. A tabela-base não está disponível, mas os métodos podem ser avaliados conceitualmente.
Remoção de duplicatas em SQL
Gabarito: letra E (somente III funcionaria). Apenas a alternativa III descreve um método viável e padrão: adicionar uma coluna de identificador único (auto incremento) e usar DELETE com EXISTS para eliminar as linhas repetidas, mantendo uma por grupo. As alternativas I e II falham por inexistência de sintaxe ou por depender de ordenação implícita.
A banca testa o conhecimento de técnicas para eliminar linhas duplicadas em SQL, um problema comum. Vamos analisar cada item.
Alternativa
Descrição do método
Funciona?
Motivo
I
DELETE com cláusula EXCEPT ONE
❌ Não
Não existe sintaxe EXCEPT ONE no SQL padrão; EXCEPT é operador de conjunto, não cláusula de exclusão.
II
DELETE com EXISTS, assumindo que a última linha de cada grupo não seria removida
❌ Não
Depende de ordem implícita (inexistente em tabelas relacionais); sem identificador único ou ordenação explícita, o resultado é imprevisível.
III
Adicionar coluna auto incremento temporária e usar DELETE com EXISTS
✅ Sim
Técnica padrão e confiável: cada linha ganha identificador único, permitindo excluir duplicatas mantendo uma por grupo.
Item I — ❌ Incorreto
"Utilizar o comando delete com a cláusula except one." Não existe no SQL padrão uma cláusula "EXCEPT ONE" para o comando DELETE. O operador EXCEPT é um operador de conjunto (set operator) usado em consultas, não em comandos de exclusão. Portanto, essa sintaxe é inválida.
Item II — ❌ Incorreto
"Utilizar o comando delete incluindo a cláusula exists, o que faria com que a última linha de cada grupo de repetições não seria removida uma vez que não mais existiria uma outra linha idêntica." Embora o DELETE com EXISTS possa ser usado para remover duplicatas, a descrição é problemática. A ideia de "última linha" depende de uma ordem específica, que não existe naturalmente em uma tabela relacional. Para funcionar, seria necessário um identificador único (como um número de linha físico, e.g., ctid no PostgreSQL ou rowid no SQLite), mas o uso de ctid não é padronizado e pode variar entre SGBDs. Além disso, a afirmação de que "a última linha de cada grupo não seria removida" não é uma regra geral; sem uma ordenação explícita, o resultado é imprevisível. Portanto, essa alternativa não é confiável.
Item III — ✅ Correto ⟵ GABARITO
"Introduzir, temporariamente, uma nova coluna na tabela, com valores gerados por meio de um mecanismo de auto increment, ou sequence, e utilizar o uso do comando delete incluindo a cláusula exists." Essa é uma técnica clássica e correta. Os passos:
Adicionar uma coluna id com auto incremento (ex.: ALTER TABLE tabela ADD COLUMN id SERIAL;).
Executar um DELETE que mantém a menor (ou maior) id para cada grupo de duplicatas. Exemplo:
DELETE FROM tabela AS t1
WHERE EXISTS (
SELECT 1 FROM tabela AS t2
WHERE t2.col1 = t1.col1 AND t2.col2 = t1.col2 -- colunas que definem duplicata
AND t2.id < t1.id -- mantém a de menor id
);
Remover a coluna temporária, se desejado.
Esse método funciona em qualquer SGBD que suporte subconsultas correlacionadas e colunas auto incrementadas, sendo portável e confiável.
Conclusão: Apenas a alternativa III descreve um método funcional. Portanto, o gabarito é a letra E.