Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165265
Banca
FGV
Órgão
STN
Ano
2024
Cargo
AFFC ( )
ATENÇÃO: use a tabela relacional IPCA a seguir para responder à próxima questão.
Tabela IPCA
indice
ano
mês
0,56
2023
12
0,28
2023
11
0,24
2023
10
. . .
. . .
. . .
0,2
2003
7
-0,15
2003
6
. . .
. . .
. . .
2,25
2003
1
2,1
2002
12
3,02
2002
11
. . .
. . .
. . .
0,57
2001
1
A instância da tabela contém os valores do índice IPCA para todos os meses dos anos de 2001 até 2023. Os valores pontilhados representam a continuidade mensal da série. Todas as colunas são numéricas e não aceitam valores nulos.
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”.
Remoção de Duplicatas em SQL
Gabarito: letra E — somente a alternativa III funcionaria. A cláusula EXCEPT ONE não existe no SQL padrão, e a abordagem com EXISTS sem um critério de distinção (como uma coluna de auto incremento) não consegue diferenciar linhas idênticas, removendo todas ou nenhuma. A solução viável é adicionar temporariamente uma coluna com valores únicos (auto incremento ou sequence) e usar DELETE com EXISTS para eliminar as duplicatas, preservando uma linha de cada grupo.
O problema central é a identificação de linhas duplicadas em uma tabela sem chave primária. Em SQL, linhas são conjuntos de valores; sem um identificador único, não há como referenciar uma linha específica. A remoção de duplicatas exige, portanto, um mecanismo para distinguir linhas idênticas.
A alternativa I propõe DELETE ... EXCEPT ONE, mas essa cláusula não existe no SQL padrão (nem no Oracle, que é o SGBD do edital). Não há sintaxe EXCEPT ONE para DELETE. A alternativa II sugere usar DELETE com EXISTS, mas sem um critério de distinção, a subconsulta EXISTS encontraria todas as linhas duplicadas e as removeria todas, pois cada linha tem uma cópia idêntica. A alternativa III resolve o problema ao introduzir uma coluna temporária com valores únicos (via SEQUENCE ou auto incremento), permitindo que o EXISTS compare linhas por um identificador distinto, mantendo uma linha de cada grupo.
A técnica correta envolve:
Adicionar uma coluna temporária com valores únicos (ex.: ALTER TABLE IPCA ADD id NUMBER; e preencher com uma sequência).
Executar um DELETE que remove linhas onde existe outra linha com os mesmos valores de indice, ano, mes, mas com id menor (ou maior).
Remover a coluna temporária.
Essa abordagem é portável e funciona em qualquer SGBD relacional. A alternativa III é a única que descreve corretamente esse processo.
NÃO CAIA NESSA!
A banca explora a confusão entre EXCEPT (operador de conjunto) e uma suposta cláusula EXCEPT ONE. O candidato pode achar que EXCEPT ONE é uma extensão válida, mas ela não existe. Além disso, a alternativa II parece plausível, mas sem um critério de distinção, o EXISTS remove todas as duplicatas, não deixando nenhuma.
Alternativa A — ❌ Incorreta
Afirma que nenhuma funcionaria. A alternativa III funciona, pois a coluna temporária com auto incremento permite distinguir linhas idênticas e remover as duplicatas.
Alternativa B — ❌ Incorreta
Afirma que todas funcionariam. A alternativa I não funciona porque EXCEPT ONE não é uma cláusula SQL válida. A alternativa II também não funciona, pois sem um critério de distinção, o EXISTS removeria todas as linhas duplicadas.
Alternativa C — ❌ Incorreta
Afirma que somente I funcionaria. A cláusula EXCEPT ONE não existe no SQL padrão, tornando a alternativa I inválida.
Alternativa D — ❌ Incorreta
Afirma que somente II funcionaria. A alternativa II, sem um critério de distinção, removeria todas as linhas duplicadas, não deixando nenhuma. O EXISTS sozinho não consegue diferenciar linhas idênticas.
Alternativa E — ✅ Correta ⟵ GABARITO
A alternativa III é a única viável. Ao adicionar uma coluna temporária com valores únicos (auto incremento ou sequence), cada linha ganha um identificador distinto. O DELETE com EXISTS pode então comparar linhas por esse identificador, removendo as duplicatas e preservando uma linha de cada grupo. Essa é a técnica clássica para eliminar duplicatas em tabelas sem chave primária.