2011-02-17 54 views
0

有人能向我解释为什么该SQL语句:SQL UNION问题

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

回报:

TEST2 
TEST3 
TEST1 

我试图找出这方面的UNION关键词背后的逻辑。 有没有办法,我能得到它返回:不使用ORDER BY条款

TEST1 
TEST2 
TEST3 

?换句话说,我可以控制UNION语句的执行顺序吗?

如果它的事项,我使用Postgre 9.0和PHP作为我的语言

非常感谢, 布雷特

+1

仅供参考 - MS SQL 08返回1,2,3,我所期待。 – asawyer 2011-02-17 19:30:25

+0

疯狂的猜测,尝试`联合所有`` – 2011-02-17 19:31:15

回答

6

按照PostgreSQL docs for UNION

UNION有效地追加QUERY2到QUERY1结果的结果(虽然没有保证,这是其中的行实际上是返回顺序)。

2

大多数数据库并不能保证任何东西的顺序没有order by声明。

联合在大多数情况下可能允许数据库并行操作所有3个查询并尽可能快地返回行。

4

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)