Considere que um Ministério Público Estadual utiliza o PostgreSQL 16 e possui dois sistemas legados que geram listas intituladas numero_processo já normalizadas e sem sobreposição interna. Notou-se que a consolidação diária está consumindo CPU por etapa de remoção de duplicidade. Nesse caso, a decisão técnica que atende ao requisito de combinar resultados sem eliminação de duplicatas é a
Asubstituição de UNION por UNION ALL, mantendo a compatibilidade de colunas entre os SELECT.
Binclusão de ORDER BY em cada SELECT interno para reduzir o custo de deduplicação do UNION.
Cmanutenção de UNION, adicionando DISTINCT no SELECT externo para reforçar a deduplicação.
Dtroca por INTERSECT para retornar a composição dos conjuntos isento do custo de ordenação.
Etroca por FULL OUTER JOIN usando COALESCE para concatenar os resultado com preservação das tuplas.
Revelar gabarito e comentário▾
GabaritoA — substituição de UNION por UNION ALL, mantendo a compatibilidade de colunas entre os SELECT.
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: UNION vs UNION ALL e eliminação de duplicatas
Gabarito: letra A. Para combinar resultados de duas consultas sem eliminar duplicatas, a decisão técnica correta é substituir UNION por UNION ALL, mantendo a compatibilidade de colunas entre os SELECT. O UNION realiza uma operação de deduplicação implícita (equivalente a um SELECT DISTINCT sobre o resultado combinado), enquanto o UNION ALL simplesmente concatena os resultados, preservando todas as linhas — exatamente o que o requisito pede.
O problema descrito é clássico em bancos de dados relacionais: quando se deseja unir resultados de duas consultas, o comando UNION é frequentemente usado por padrão, mas ele impõe um custo adicional de ordenação e remoção de duplicatas. No PostgreSQL, o UNION é implementado de forma que o otimizador precisa identificar e eliminar linhas repetidas entre os dois conjuntos, o que pode ser caro, especialmente em tabelas grandes. O UNION ALL, por outro lado, apenas concatena os resultados, sem qualquer verificação de duplicidade, tornando a operação mais rápida e eficiente.
A questão menciona que as listas numero_processo já estão normalizadas e sem sobreposição interna. Isso significa que, dentro de cada lista individual, não há duplicatas. No entanto, ao combinar as duas listas com UNION, o banco ainda precisa verificar se não há duplicatas entre as duas listas, mesmo que elas não tenham sobreposição. Essa verificação é desnecessária se o requisito é apenas combinar os resultados sem eliminar duplicatas — e é exatamente aí que o UNION ALL se destaca.
Na prática, considere duas consultas que retornam listas de números de processo:
Consulta A: retorna {1, 2, 3}
Consulta B: retorna {3, 4, 5}
Com UNION, o resultado seria {1, 2, 3, 4, 5} (o 3 aparece apenas uma vez). Com UNION ALL, o resultado seria {1, 2, 3, 3, 4, 5} (o 3 aparece duas vezes). Se o requisito é combinar sem eliminar duplicatas, o UNION ALL é a escolha correta, pois preserva todas as ocorrências.
A pegadinha da banca está em confundir o papel de cada operador: o UNIONsempre elimina duplicatas, independentemente de haver ou não sobreposição entre as consultas. O UNION ALL é a única forma de combinar resultados sem essa eliminação. As demais alternativas tentam contornar o problema de outras formas, mas todas são incorretas ou ineficazes.
Guarde a distinção central: UNION = concatenação + deduplicação; UNION ALL = concatenação pura. É exatamente nessa fronteira que as alternativas se dividem.
Operadores de Conjuntos em SQL — só UNION: deduplicação; só UNION ALL: concatenação pura; UNION∩UNION ALL: combina resultados
Alternativa A — ✅ Correta ⟵ GABARITO
A substituição de UNION por UNION ALL é a decisão técnica que atende ao requisito de combinar resultados sem eliminação de duplicatas. O UNION ALL simplesmente concatena os resultados das duas consultas, preservando todas as linhas, sem qualquer custo de deduplicação. A compatibilidade de colunas entre os SELECT é um pré-requisito para ambos os operadores, mas não é o que define a eliminação de duplicatas — é apenas uma condição para que a união seja válida.
Alternativa B — ❌ Incorreta
A inclusão de ORDER BY em cada SELECT interno não reduz o custo de deduplicação do UNION. O ORDER BY é usado para ordenar os resultados, mas a deduplicação do UNION é uma operação separada que ocorre independentemente da ordenação. Na verdade, adicionar ORDER BY pode até aumentar o custo, pois exige uma etapa adicional de ordenação. O UNION já realiza a deduplicação implicitamente, e o ORDER BY não interfere nesse processo.
Alternativa C — ❌ Incorreta
Manter o UNION e adicionar DISTINCT no SELECT externo é redundante e não resolve o problema. O UNION já elimina duplicatas internamente, então adicionar DISTINCT no SELECT externo não muda nada — as duplicatas já foram removidas. Além disso, o requisito é não eliminar duplicatas, então essa alternativa vai na direção oposta, reforçando a deduplicação em vez de evitá-la.
Alternativa D — ❌ Incorreta
Trocar por INTERSECT é completamente equivocado. O INTERSECT retorna apenas as linhas que aparecem em ambas as consultas (a interseção dos conjuntos), não a composição dos conjuntos. O requisito é combinar os resultados, ou seja, unir as duas listas, não encontrar a interseção. Além disso, o INTERSECT também elimina duplicatas, o que contraria o requisito de preservá-las.
Alternativa E — ❌ Incorreta
Trocar por FULL OUTER JOIN usando COALESCE é uma abordagem incorreta e desnecessariamente complexa. O FULL OUTER JOIN é usado para combinar linhas de duas tabelas com base em uma condição de junção, preservando linhas sem correspondência. No entanto, para simplesmente concatenar duas listas de valores, o JOIN não é apropriado — ele exigiria uma condição de junção artificial e produziria um resultado diferente do esperado. O COALESCE é usado para lidar com valores nulos, não para concatenar resultados. A forma correta de combinar resultados de duas consultas é usar UNION ou UNION ALL, não um JOIN.