PostgreSQL UNION
O operador `UNION` no PostgreSQL é utilizado para combinar os conjuntos de resultados de duas ou mais consultas `SELECT` em um único conjunto de resultados, eliminando as linhas duplicadas. Isso garante que o conjunto de resultados combinados seja exclusivo. A ordenação do conjunto de resultados não é inerentemente feita pelo `UNION` e deve ser explicitamente especificada com uma cláusula `ORDER BY`.
Uso
O operador `UNION` é usado quando você precisa agregar resultados de várias instruções `SELECT` em um conjunto de dados coeso. Isso é particularmente útil para mesclar tabelas com estruturas semelhantes.
SELECT column1, column2, ...
FROM table1
UNION
SELECT column1, column2, ...
FROM table2;
Nessa sintaxe, `UNION` mescla os resultados das duas instruções `SELECT`, descartando quaisquer linhas duplicadas. Os nomes de coluna implícitos no conjunto de resultados são derivados da primeira instrução `SELECT`.
Exemplos
1. União básica
SELECT city
FROM customers
UNION
SELECT city
FROM suppliers;
Este exemplo mescla uma lista de cidades das tabelas `customers` e `suppliers`, removendo as duplicatas para que você tenha uma lista única.
2. UNION com nomes de coluna diferentes
SELECT first_name AS name
FROM employees
UNION
SELECT supplier_name AS name
FROM suppliers;
Aqui, as colunas com nomes diferentes são combinadas usando `UNION`. O alias `name` se aplica ao conjunto de resultados, e a consistência dos aliases é crucial para a legibilidade e a manutenção. As colunas devem ter o mesmo tipo de dados.
3. UNION com ORDER BY
SELECT product_name
FROM products
UNION
SELECT service_name
FROM services
ORDER BY 1;
Este exemplo combina nomes de produtos e serviços em uma lista e ordena todo o conjunto de resultados em ordem alfabética. A cláusula `ORDER BY` usa a posição da coluna, o que geralmente é recomendado para evitar ambiguidade.
Dicas e práticas recomendadas
- Garanta a compatibilidade da coluna. O número e os tipos de dados das colunas em cada `SELECT` devem corresponder.
- Use `UNION ALL` para obter desempenho. Se as duplicatas forem aceitáveis, o `UNION ALL` evita a sobrecarga de classificação e remoção de duplicatas.
- Seja cauteloso com `ORDER BY`. Somente o `SELECT` final pode incluir uma cláusula `ORDER BY`, afetando todo o conjunto de resultados. Faça referência aos nomes das colunas de saída ou use as posições das colunas para evitar ambiguidade.
- Verifique se você está lidando com NULL. Certifique-se de que as colunas nas consultas tratem os valores `NULL` de forma consistente para evitar resultados inesperados.
- Considere a indexação. As tabelas de indexação usadas em consultas `UNION` podem otimizar o desempenho, acelerando a recuperação de dados.
- Compreender as implicações do desempenho. O uso do `UNION` pode envolver processamento adicional para classificação e eliminação de duplicatas em comparação com o `UNION ALL`.