powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сортировка в деревянных запросах, помогите плиз.
9 сообщений из 9, страница 1 из 1
Сортировка в деревянных запросах, помогите плиз.
    #32077488
Василий Алибабаевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT  

LEVEL  "DQUERY_LEVEL" 
,a.*
,b.DQUERY_XML  "DQUERY_XML"  
,c.DQUERY_USER  "GRANTEE"  
,DECODE(a.DQUERY_USER,USER, 1 , 0 )  "DQUERY_ACCESS_TYPE"  
,d.DQUERY_XML  "DQUERY_CHANGES_XML"  
 

FROM  
SM_DQUERY a left join SM_DQUERY_XML b on (a.DQUERY_ID=b.DQUERY_ID)  
 left join  SM_DQUERY_GRANT c on (a.DQUERY_ID=c.DQUERY_ID AND c.DQUERY_USER=USER) 
  left join SM_DQUERY_CHANGES d on (a.DQUERY_ID=d.DQUERY_ID and d.DQUERY_USER=USER) 

WHERE  
(a.DQUERY_USER=USER OR c.DQUERY_USER=USER) 
START WITH DQUERY_PARENT_ID is Null 
CONNECT BY PRIOR a.DQUERY_ID=DQUERY_PARENT_ID


Необходимо чтобы дочерние ноды внутри родителя сортировались по алфавиту .... как это сделать?
...
Рейтинг: 0 / 0
Сортировка в деревянных запросах, помогите плиз.
    #32077490
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по синтакситу с join'ами, у тебя 9i? Тогда дополни запрос:
Код: plaintext
1.
2.
3.
connect by prior ...
start with ...
order siblings by field_name
...
Рейтинг: 0 / 0
Сортировка в деревянных запросах, помогите плиз.
    #32077498
Василий Алибабаевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сенькю
...
Рейтинг: 0 / 0
Сортировка в деревянных запросах, помогите плиз.
    #32077607
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как это реализовать в oracle8i?
...
Рейтинг: 0 / 0
Сортировка в деревянных запросах, помогите плиз.
    #32077609
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для версии 8i чтобы выполнить сортировку нужно приложить несколько больше усилий. Основной технологией является метод с применением промежуточной таблицы. Лучше всего для этого использовать global temporary table, как наиболее производительное решение. Этот метод использует тот факт, что при отсутствии каких-либо параметров сортировки и/или группировки Oracle будет выбирать строки из таблиц в порядке их физического расположения. Для увеличения производительности, особенно в случае больших объемов выборки, желательно использовать индексирование global temporary table.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create global temporary table tmp_tree (
node_id number,
root_id number);
create unique index i_tmp_node on tmp_tree(node_id);
create index i_tmp_root on tmp_tree(root_id);

insert into tmp_tree
select node_id, root_id from a_tree
order by node_id desc;

select lpad('.',(level- 1 )* 2 ,'.') || to_char(node_id) node, level
from tmp_tree
connect by prior node_id=root_id
start with root_id= 0 ;

NODE			  LEVEL
 -------------------- ----------
 
 1 			       1 
.. 4 			       2 
.... 12 		               3 
...... 19 		       4 
...... 18 		       4 
.... 11 		               3 
.... 10 		               3 
...... 17 		       4 
...... 16 		       4 
...
Рейтинг: 0 / 0
Сортировка в деревянных запросах, помогите плиз.
    #32077611
Mergen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за объяснение друг!
...
Рейтинг: 0 / 0
Сортировка в деревянных запросах, помогите плиз.
    #32077612
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я не сейчас написал, это выдернуто из будущей статьи по иерархическим
структурам.
...
Рейтинг: 0 / 0
Сортировка в деревянных запросах, помогите плиз.
    #32077786
Фотография hinotf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в 8i ещё должен помогать индекс по этому полю
...
Рейтинг: 0 / 0
Сортировка в деревянных запросах, помогите плиз.
    #32078614
EternalWonderer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот ситуация для 8i:

Имеем две таблицы, оччень похожие, структура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE CATALOG_SI
(
 ID            NUMBER( 4 )                       NOT NULL,
 PARENT        NUMBER( 4 ),
 CAPTION       VARCHAR2( 50 )                    NOT NULL,
...
CREATE UNIQUE INDEX CATALOG_SI_PK0 ON CATALOG_SI (ID)
CREATE UNIQUE INDEX CATALOG_SI_UC1 ON CATALOG_SI
(PARENT, CAPTION)


При выполнении запроса
Код: plaintext
1.
2.
3.
SELECT  ID, (LEVEL -  1 ) l_parent, caption, is_type
     FROM catalog_si
START WITH PARENT =  0 
CONNECT BY PRIOR ID = PARENT


Первая таблица выводит строки как надо (по алфавиту), а вторая - как попало (видимо, в порядке ввода), зараза, пока в запрос не добавишь хинт вида
Код: plaintext
 /*+ INDEX (CATALOG_si CATALOG_si_UC1) */ 


План запроса без хинта:
Код: plaintext
1.
2.
3.
4.
SELECT STATEMENT Hint=CHOOSE  
CONNECT BY
 INDEX FAST FULL SCAN CATALOG_SI_UC1
 TABLE ACCESS BY USER ROWID CATALOG_SI
 TABLE ACCESS FULL CATALOG_SI        

С хинтом:
Код: plaintext
1.
2.
3.
4.
5.
SELECT STATEMENT Hint=CHOOSE
CONNECT BY
 INDEX FAST FULL SCAN CATALOG_SI_UC1
 TABLE ACCESS BY USER ROWID CATALOG_SI
 TABLE ACCESS BY INDEX ROWID CATALOG_SI
   INDEX RANGE SCAN CATALOG_SI_UC1        


Отсюда продолжение вопроса: является ли применение указанного хинта гарантией требуемого результата?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сортировка в деревянных запросах, помогите плиз.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]