можно ли упорядочить по rowid ?

egaron
Дата: 20.02.2007 15:01:27
Cуть. Во временную таблицу записываются результаты селекта.

Сам селект представляет собой запрос с промежуточными итогами (rollup) по каждому столбцу, доходящим до полного ИТОГО.

Все бы хорошо, но ....

Селект выводится всегда в правильном порядке.

А если его заинсертить в таблицу, то она уже выводится в неправильном (например, общее "ИТОГО" может быть посередине).

Вопрос - как сгруппировать ? пробовал order by вычисляемым полем-ключом, но получается значительный оверхед из-за сложных выражений . Либо надобность лезть во внутренний селект и добавлять вычисляемый столбец спецом для группировки - опять оверхед + его надо вносить под group by rollup .... , а иначе будет not group by expression.

А если уж вносить, то это породит лишнюю группу-одиночный итог после каждой строки, которую опять же надо отсекать либо having во внутреннем селекте, либо where во внешнем.

В общем, громоздко и некрасиво получается.

То есть, чтобы сохранить во временной таблице некий порядок строк, нужен какой-то искуственной генерируемый ключ для order by, а простого способа генерации его нет.

Тем временем обнаружил эмпирическим путем, что в качестве такого ключа можно использовать rowid.

Теперь вопрос в студию - всегда ли можно использовать rowid и гарантирует ли он правильный порядок строк в запросе с промежуточными итогами ?


  insert into tmp$prepareGBRObjects(history_id, grp, district_id, person_type, estate_type, quantity)
    select
     gv_history_id, grp,     
     decode(grp, '011', 'Âñåãî ïî ' || district_id , district_id ) district_id,
     decode(grp, '001', 'Âñåãî ïî ' || person_type , person_type ) person_type,
     decode(grp,'111', 'ÈÒÎÃÎ: ',   estate_type) estate_type,
     quantity
from
(
    --  <v   ....    CREATE OR REPLACE VIEW v_gbr$ as
     select
       grouping(o.gninmb) || grouping(decode(s.type_np,1,'ÞË','ÔË')) || grouping(o.code_im) grp,
       o.gninmb district_id,
       decode(s.type_np,1,'ÞË','ÔË') person_type,
       o.code_im estate_type,
       count(*) quantity
      from krt_sgbr_n s,
       krt_ogbr_n o
      where s.isn_resp='1'
      and o.id_object=s.id_object
      and s.type_inf in (1,2,5,6) --ñîáñòâåííîñòü áåç àðåíäû  3,4 - àðåíäà
      and 
       o.code_im in
      (select parameter_value from int$report_user_query where history_id = gv_history_id and parameter_id = p_lookup)
     and nvl(s.date_reg,s.date_control) <= d_dateFrom
     and ((d_dateTill is null) or (nvl(s.date_reg_e  ,s.date_control_end)<d_dateTill))
     group by --to_char(nvl(s.date_reg,s.date_control),'yyyy'),
     rollup
     (
       o.gninmb,
       decode(s.type_np,1,'ÞË','ÔË'),
       o.code_im
     )
     --- /> v
);
bbam
Дата: 20.02.2007 15:09:49
Может лучше так?

  insert into tmp$prepareGBRObjects(history_id, grp, district_id, person_type, estate_type, quantity, row_index)
    select
     gv_history_id, grp,     
     decode(grp, '011', 'Âñåãî ïî ' || district_id , district_id ) district_id,
     decode(grp, '001', 'Âñåãî ïî ' || person_type , person_type ) person_type,
     decode(grp,'111', 'ÈÒÎÃÎ: ',   estate_type) estate_type,
     quantity, 
     rownum
from
(
...
);
[/quot]

конечно сортируя по rowid ты записи упорядочиш, но совершенно не факт, что в нужном тебе порядке.
dmidek
Дата: 20.02.2007 15:09:55
egaron
Теперь вопрос в студию - всегда ли можно использовать rowid и гарантирует ли он правильный порядок строк в запросе с промежуточными итогами ?


Никогда нельзя.

А так не пойдет ?

SQL> select deptno, empno , grouping(empno) from scott.emp
  2  group by rollup(deptno, empno)
  3  order by deptno, grouping(empno)
  4  /

DEPTNO EMPNO GROUPING(EMPNO)
------ ----- ---------------
    10  7934               0
    10  7839               0
    10  7782               0
    10                     1
    20  7876               0
    20  7788               0
    20  7566               0
    20  7902               0
    20  7369               0
    20                     1
    30  7900               0
    30  7499               0
    30  7521               0
    30  7654               0
    30  7698               0
    30  7844               0
    30                     1
    40   222               0
    40                     1
                           1

20 rows selected

SQL> 
TiG
Дата: 20.02.2007 15:10:06
select rownum rn, r.*
from (
  select ....
  ...
  group by ...
) r

?
egaron
Дата: 20.02.2007 15:24:08
dmidek
egaron
Теперь вопрос в студию - всегда ли можно использовать rowid и гарантирует ли он правильный порядок строк в запросе с промежуточными итогами ?


Никогда нельзя.

А так не пойдет ?

SQL> select deptno, empno , grouping(empno) from scott.emp
  2  group by rollup(deptno, empno)
  3  order by deptno, grouping(empno)
  4  /

DEPTNO EMPNO GROUPING(EMPNO)
------ ----- ---------------
    10  7934               0
 
20 rows selected

SQL> 


Если было бы так просто - это собственно и есть искуственный ключ.

Но, дело в том, что
1) во внешней таблице данные уже расписаны по "итого", как в отчете. То есть под группой 302, к примеру, поле "итого" выводится как null, а информацию о том, что это "итог по 302", можно
получить только ректально и громоздко.

2) нормальный "ордер" можно задать только во внутреннем селекте, но этого не позволяет SQL.
И опять же - задашь - как сохранить в псевдостолбце, чтобы потом на него опираться ? опять rowid ?

Остается (без триков) только псевдоключ во внутреннем селекте с паразитной отсекаемой строкой-итогом для кжадой группы. С этой стадии собственно я и начал запрос оптимизировать ))


(прошу прощения, крокозябры в листинге - это слова "всего" и "итого по...")

[SRC oracle
]000 7801 ÔË 302 2226
001 7801 Âñåãî ïî ÔË 2226
000 7801 ÞË 301 1
000 7801 ÞË 302 425
001 7801 Âñåãî ïî ÞË 426
011 Âñåãî ïî 7801 2652
000 7802 ÔË 301 82
000 7802 ÔË 302 4478
001 7802 Âñåãî ïî ÔË 4560[/SRC]
egaron
Дата: 20.02.2007 15:25:40
TiG
select rownum rn, r.*
from (
  select ....
  ...
  group by ...
) r

?


Спасибо, похоже на правду
Elic
Дата: 20.02.2007 15:44:14
egaron
TiG
select rownum rn, r.*
from (
  select ....
  ...
  group by ...
) r
Спасибо, похоже на правду
Порядок строк гарантирует только order by.
pretoreani
Дата: 20.02.2007 15:54:02
а может есть смысл попробовать
insert --+ append
into ...
select ...

думается тогда строки вставятся ровно также как они при селекте выбирались.
alex-ls
Дата: 20.02.2007 17:58:42
pretoreani
а может есть смысл попробовать
insert --+ append
into ...
select ...
думается тогда строки вставятся ровно также как они при селекте выбирались.

смотрите пост Elic'а выше!
mcureenab
Дата: 20.02.2007 18:12:33
egaron

2) нормальный "ордер" можно задать только во внутреннем селекте, но этого не позволяет SQL.


Ты отстал.

select rownum, t.*
from
 (select *
  from dual
  order by 1
 ) t
/

    ROWNUM D
---------- -
         1 X

SQL>