SQL UNION Вопрос - PullRequest
       8

SQL UNION Вопрос

0 голосов
/ 17 февраля 2011

Может кто-нибудь объяснить мне, почему оператор SQL:

SELECT 'TEST1'
UNION SELECT 'TEST2'
UNION SELECT 'TEST3'

возвращает:

TEST2
TEST3
TEST1

Я пытаюсь понять логику ключевого слова UNION в этом аспекте,Есть ли способ, чтобы я мог вернуть:

TEST1
TEST2
TEST3 

без использования предложения ORDER BY?Другими словами, могу ли я контролировать порядок выполнения операторов UNION?

Если это имеет значение, я использую Postgre 9.0 и PHP в качестве языка

Большое спасибо, Бретт

Ответы [ 3 ]

6 голосов
/ 17 февраля 2011

Согласно документации PostgreSQL для UNION :

UNION эффективно добавляет результат query2 к результату query1 (, хотя нет никаких гарантий, чтопорядок, в котором строки действительно возвращаются ).

4 голосов
/ 17 февраля 2011
Семантика

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)
2 голосов
/ 17 февраля 2011

Большинство баз данных не гарантируют порядок чего-либо без оператора order by.

В большинстве случаев объединение может позволить базе данных обрабатывать все 3 запроса параллельно и возвращать строки максимально быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...