Sort order in sub-select

Поиск
Список
Период
Сортировка
От Craig A. James
Тема Sort order in sub-select
Дата
Msg-id 44A4AEAE.8070809@modgraph-usa.com
обсуждение исходный текст
Ответы Re: Sort order in sub-select  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-performance
Here is a question about SQL.  I have a one-to-many pair of tables (call them "P" and "C" for parent and child).  For
eachrow of P, there are many rows in C with data, and I want to sort P on the min(c.data).  The basic query is simple: 

  select p_id, min(data) as m from c group by p_id order by m;

Now the problem: I also want to store this, in sorted order, as a "hitlist", so I have a table like this:

  create table hitlist(p_id integer, sortorder integer);

and a sequence to go with it.  The first thing I tried doesn't work:

  insert into hitlist(p_id, sortorder)
    (select p_id, nextval('hitlist_seq') from
       (select p_id, min(data) as m from c group by p_id order by m);

Apparently, the sort order returned by the innermost select is NOT maintained as you go through the next select
statement-- the rows seem to come out in random order.  This surprised me.  But in thinking about the definition of SQL
itself,I guess there's no guarantee that sort order is maintained across sub-selects.  I was caught by this because in
Oracle,this same query works "correctly" (i.e. the hitlist ends up in sorted order), but I suspect that was just the
luckof their implementation. 

Can anyone confirm this, that the sort order is NOT guaranteed to be maintained through layers of SELECT statements?

The apparent solution is to make the hitlist.sortorder column have nextval() as its default and eliminate the first
sub-select. But I thought the two would be equivalent. 

Thanks,
Craig


В списке pgsql-performance по дате отправления:

Предыдущее
От: "Craig A. James"
Дата:
Сообщение: explain analyze reports 20x more time than actual
Следующее
От: Tom Lane
Дата:
Сообщение: Re: explain analyze reports 20x more time than actual