Семантика
UNION
заключается в удалении дубликатов.PostgreSQL использует функцию Hash для удаления дубликатов, а результаты выводятся в порядке хэша ключа.
Вы можете использовать UNION ALL
, но SQL по-прежнему не гарантирует порядок, если вы не используетепредложение ORDER BY
.
EXPLAIN
SELECT 'TEST1'
UNION SELECT 'TEST2'
UNION SELECT 'TEST3'
Производит:
HashAggregate (cost=0.07..0.10 rows=3 width=0)
-> Append (cost=0.00..0.06 rows=3 width=0)
-> Subquery Scan on "*SELECT* 1" (cost=0.00..0.02 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
-> Subquery Scan on "*SELECT* 2" (cost=0.00..0.02 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
-> Subquery Scan on "*SELECT* 3" (cost=0.00..0.02 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
Принимая во внимание
EXPLAIN
SELECT 'TEST1'
UNION ALL SELECT 'TEST2'
UNION ALL SELECT 'TEST3'
Производит:
Append (cost=0.00..0.06 rows=3 width=0)
-> Subquery Scan on "*SELECT* 1" (cost=0.00..0.02 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
-> Subquery Scan on "*SELECT* 2" (cost=0.00..0.02 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
-> Subquery Scan on "*SELECT* 3" (cost=0.00..0.02 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)