Обсуждение: Problems with UNION ALL and ORDER BY

Поиск
Список
Период
Сортировка

Problems with UNION ALL and ORDER BY

От
Kaloyan Iliev Iliev
Дата:
Dear friends...,I have the following problem:


select
.....
from
....
where
....UNION ALL

select
...
from
....
where
....
ORDER BY field1

But the the order by doesn't work properly. It returns the rows of the 
first query ordered and then appends the rows of the second query 
ordered. But this is not what i expect. I expect the result of both 
queries to be orderd. So I try.

SELECT TEMP.*
FROM
(
select
.....
from
....
where
....UNION ALL

select
...
from
....
where
....
) TEMP
ORDER BY TEMP.field1

But this also doesn't work. Any ideas.p


Re: Problems with UNION ALL and ORDER BY

От
Tom Lane
Дата:
Kaloyan Iliev Iliev <news1@faith.digsys.bg> writes:
>  I have the following problem:

> select
> .....
> from
> ....
> where
> ....
>  UNION ALL

> select
> ...
> from
> ....
> where
> ....
> ORDER BY field1

> But the the order by doesn't work properly. It returns the rows of the 
> first query ordered and then appends the rows of the second query 
> ordered.

Pray tell, what Postgres release are you using?

AFAICT this will result in an overall sort in all PG releases since 7.0.
I don't have anything older to test...
        regards, tom lane


Re: Problems with UNION ALL and ORDER BY

От
Kaloyan Iliev Iliev
Дата:
Dear Tom,

As I say in my previous letter I am using 7.2.3. If you wish I can show 
you the query and the result to see for yourself, that there is 
something wrong. It just don't order the overall result but the separate 
results of the both subqueries.

Tom Lane wrote:

>Kaloyan Iliev Iliev <news1@faith.digsys.bg> writes:
>  
>
>> I have the following problem:
>>    
>>
>
>  
>
>>select
>>.....
>>from
>>....
>>where
>>....
>> UNION ALL
>>    
>>
>
>  
>
>>select
>>...
>>from
>>....
>>where
>>....
>>ORDER BY field1
>>    
>>
>
>  
>
>>But the the order by doesn't work properly. It returns the rows of the 
>>first query ordered and then appends the rows of the second query 
>>ordered.
>>    
>>
>
>Pray tell, what Postgres release are you using?
>
>AFAICT this will result in an overall sort in all PG releases since 7.0.
>I don't have anything older to test...
>
>            regards, tom lane
>
>
>  
>


Re: Problems with UNION ALL and ORDER BY

От
Gaetano Mendola
Дата:
Kaloyan Iliev Iliev wrote:
> 
> Dear friends...,
> I have the following problem:
> 
> 
> select  .....  from  ....  where  ....
> UNION ALL
> 
> select ...  from  ....  where  ....
> ORDER BY field1
> 
> But the the order by doesn't work properly. It returns the rows of the 
> first query ordered and then appends the rows of the second query 
> ordered. But this is not what i expect. I expect the result of both 
> queries to be orderd. So I try.
> 
> SELECT TEMP.*
> FROM
> (
> select ..... from  ....  where  ....
> UNION ALL
> 
> select ...  from  ....  where ....
> ) TEMP
> ORDER BY TEMP.field1
> 
> But this also doesn't work. Any ideas.p

This have to work. Could you please provide a real example ( creation table,
insertion data and query execution ).


Regards
Gaetano Mendola




Re: Problems with UNION ALL and ORDER BY

От
Tom Lane
Дата:
Kaloyan Iliev Iliev <news1@faith.digsys.bg> writes:
> As I say in my previous letter I am using 7.2.3. If you wish I can show 
> you the query and the result to see for yourself, that there is 
> something wrong. It just don't order the overall result but the separate 
> results of the both subqueries.

Quite honestly, I don't believe it.  In 7.2 I get

regression=# explain select * from tenk1 a union all select * from tenk1 b order by unique1;
NOTICE:  QUERY PLAN:

Sort  (cost=3128.28..3128.28 rows=20000 width=148) ->  Append  (cost=0.00..760.00 rows=20000 width=148)       ->
SubqueryScan *SELECT* 1  (cost=0.00..380.00 rows=10000 width=148)             ->  Seq Scan on tenk1 a
(cost=0.00..380.00rows=10000 width=148)       ->  Subquery Scan *SELECT* 2  (cost=0.00..380.00 rows=10000 width=148)
        ->  Seq Scan on tenk1 b  (cost=0.00..380.00 rows=10000 width=148)
 

EXPLAIN

and as you can see there's only one sort step being applied to the union
result.

Now if EXPLAIN shows you a different sorting structure for your query,
then I'd be interested to see the exact query and the EXPLAIN output.
But what I think is that you are misinterpreting the sorting result you
get.  If you are using a non-C locale you may be seeing some pretty
weird sorting rules :-(
        regards, tom lane