Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 ORDER SIBLINGS BY работает неожиданным образом  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
Здравствуйте!

Что-то я не понимаю как работает ORDER SIBLINGS BY в иерархических запросах.
Запрос
SELECT  level, tbl.IDDOCTYPES, tbl.ORDERIDX  FROM DOCTYPES tbl WHERE 
  tbl.IDDOCTYPES IN (13,44,242,14,15,18,66,9,10,11,12,131,75,121,190,217,220)
 START WITH (PARENTTYPE=IDDOCTYPES) OR (PARENTTYPE IS NULL) 
 CONNECT BY NOCYCLE PRIOR IDDOCTYPES = PARENTTYPE ORDER SIBLINGS BY tbl.ORDERIDX
выдаёт
LEVEL	IDDOCTYPES	ORDERIDX
1 1 13 60
2 2 44 50
3 2 242 60
4 1 14 55
5 1 15 99
6 1 18 97
7 1 66 3
8 2 9 3
9 2 10 3
10 2 11 3
11 2 12 3
12 2 131 5
13 1 75 1
14 1 121 88
15 1 190 50
16 1 217 90
17 1 220 95

А проблема в том, что последний столбех (ORDERIDX) не отсортирован для первого уровня :(
Я почему то ожидал, что первый уровень иерархии отсортируется на общих основаниях, но видно ошибся...
Есть идеи как его таки отсортировать?

с уважением,
Дмитрий Жучков
11 апр 07, 14:17    [4006643]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
первый столбец в результатах оказался случайно - это просто порядковый номер строки...
LEVEL	IDDOC	ORDERIDX
1 13 60
2 44 50
2 242 60
1 14 55
1 15 99
1 18 97
1 66 3
2 9 3
2 10 3
2 11 3
2 12 3
2 131 5
1 75 1
1 121 88
1 190 50
1 217 90
1 220 95

вот так будет корректнее...

с уважением,
Дмитрий Жучков
11 апр 07, 14:19    [4006662]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Oracle® Database
SQL Reference
10g Release 2 (10.2)
B14200-01
June 2005
Note: In a hierarchical query, do not specify either ORDER BY or
GROUP BY, as they will destroy the hierarchical order of the CONNECT
BY results. If you want to order rows of siblings of the same parent,
then use the ORDER SIBLINGS BY clause. See order_by_clause on
page 19-28.
siblings - записи-сестры; узлы-братья (в древовидной структуре)

Покажите, пожалуйста, значения PARENTTYPE в вашей выборке.
11 апр 07, 14:32    [4006772]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
да оно понятно, что sibling'и это потомки,
просто почему первый уровень должен отличаться в этом смысле от других? :)

   	LEVEL	PARENT	IDDOC	ORDERIDX
1 1 13 13 60
2 2 13 44 50
3 2 13 242 60
4 1 14 14 55
5 1 15 15 99
6 1 18 18 97
7 1 66 66 3
8 2 66 9 3
9 2 66 10 3
10 2 66 11 3
11 2 66 12 3
12 2 66 131 5
13 1 75 75 1
14 1 121 121 88
15 1 190 190 50
16 1 217 217 90
17 1 220 220 95
с уважением,
Дмитрий Жучков
11 апр 07, 14:36    [4006800]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Elic
Member

Откуда:
Сообщений: 29990
Dimkas
почему первый уровень должен отличаться в этом смысле от других? :)
Потому что у него нет родителя.
11 апр 07, 14:44    [4006844]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
Elic
Потому что у него нет родителя.

вопрос вобщем-то был уже риторический :)

другой вопрос - как всё таки отсортировать первый уровень с сохранием структуры дерева в свете того что:
Oracle doc
In a hierarchical query, do not specify either ORDER BY or
GROUP BY, as they will destroy the hierarchical order of the CONNECT
BY results. If you want to order rows of siblings of the same parent,
then use the ORDER SIBLINGS BY clause. See order_by_clause on
page 19-28.

?
11 апр 07, 14:47    [4006863]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
А что вам не нравится?
На первом уровне у вас все они дети разных родителей...
11 апр 07, 14:48    [4006868]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
SQL*Plus
А что вам не нравится?
На первом уровне у вас все они дети разных родителей...
Да. Правильно. Согласен.
Первый уровень это самые-самые (пра)родители и есть. :-)
11 апр 07, 14:51    [4006891]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
SQL*Plus
SQL*Plus
А что вам не нравится?
На первом уровне у вас все они дети разных родителей...
Да. Правильно. Согласен.
Первый уровень это самые-самые (пра)родители и есть. :-)

Какие-то разговоры с самим собой :))

По делу - элементы первого уровня вообще говоря можно воспринимать как _потомков_ одного (невидимого) элемента нулевого уровня. И в этом смысле их вполне можно подвести под общее правило сортировки.

Но это всё лирика - Oracle Corp. на данный момент думает по другому, возможно передумает.

На практике меня интересует - как из всё таки отсортировать с соблюдением структуры дерева?
Есть идеи?
11 апр 07, 14:55    [4006922]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Dimkas
..другой вопрос - как всё таки отсортировать первый уровень с сохранием структуры дерева в свете того что:..?
имхо, сконструируйте корневым родителям общего дедушку, которого потом можно изъять where level>1
11 апр 07, 14:55    [4006926]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
orawish
Dimkas
..другой вопрос - как всё таки отсортировать первый уровень с сохранием структуры дерева в свете того что:..?
имхо, сконструируйте корневым родителям общего дедушку, которого потом можно изъять where level>1

пошёл конструировать - тем более претендент на дедушку уже и правда есть :)
11 апр 07, 15:11    [4007046]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Dimkas
По делу - элементы первого уровня вообще говоря можно воспринимать как _потомков_ одного (невидимого) элемента нулевого уровня. И в этом смысле их вполне можно подвести под общее правило сортировки.

Но это всё лирика - Oracle Corp. на данный момент думает по другому, возможно передумает


Oracle
Oracle processes hierarchical queries as follows:
■ A join, if present, is evaluated first, whether the join is specified in the FROM clause
or with WHERE clause predicates.
■ The CONNECT BY condition is evaluated.
■ Any remaining WHERE clause predicates are evaluated.

Oracle then uses the information from these evaluations to form the hierarchy using
the following steps:

1. Oracle selects the root row(s) of the hierarchy--those rows that satisfy the START
WITH condition.

2. Oracle selects the child rows of each root row. Each child row must satisfy the
condition of the CONNECT BY condition with respect to one of the root rows.

3. Oracle selects successive generations of child rows. Oracle first selects the children
of the rows returned in step 2, and then the children of those children, and so on.
Oracle always selects children by evaluating the CONNECT BY condition with
respect to a current parent row.

4. If the query contains a WHERE clause without a join, then Oracle eliminates all
rows from the hierarchy that do not satisfy the condition of the WHERE clause.
Oracle evaluates this condition for each row individually, rather than removing all
the children of a row that does not satisfy the condition.

5. Oracle returns the rows in the order shown in Figure 9–1. In the diagram, children
appear below their parents. For an explanation of hierarchical trees, see Figure 3–1,
"Hierarchical Tree" on page 3-3.

To find the children of a parent row, Oracle evaluates the PRIOR expression of the
CONNECT BY condition for the parent row and the other expression for each row in the
table. Rows for which the condition is true are the children of the parent. The CONNECT
BY condition can contain other conditions to further filter the rows selected by the
query. The CONNECT BY condition cannot contain a subquery.
If the CONNECT BY condition results in a loop in the hierarchy, then Oracle returns an
error. A loop occurs if one row is both the parent (or grandparent or direct ancestor)
and a child (or a grandchild or a direct descendent) of another row.
11 апр 07, 16:56    [4007792]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
orawish

идея с дедушкой успешно реализована - спасибо за подсказку
SQL*Plus

Oracle
Oracle processes hierarchical queries as follows:

эта цитата здесь к чему?
я уже смирился с тем как устроена работа с иерархическими запросами...
просто вызывает удивление почему первый уровень иерархии должен выбиваться из сортировки?
неуже ли кто-то выводит деревья держа в голове загадочную мысль - "отсортировать потомков всех узлов всех уровней по алфавиту, а первый уровень оставить в художественном беспорядке"? :)
12 апр 07, 11:07    [4010741]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Dimkas
orawish

идея с дедушкой успешно реализована - спасибо за подсказку
SQL*Plus

Oracle
Oracle processes hierarchical queries as follows:

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

Oracle
1. Oracle selects the root row(s) of the hierarchy--those rows that satisfy the START WITH condition.
В вашем случае строится не одно дерево, а набор деревьев - "куст".
Для каждого из "стволов" ("ветвей") этого "куста" соблюдаются заданные во фразе ORDER SIBLINGS BY
правила сортировки записей-сестер (узлов-братьев), имеющих общего родителя (rows of siblings of the same parent).
Никаких дополнительных указаний по сортировке самих "стволов" ORDER SIBLINGS BY не дает.

Поэтому все "удивления" и "загодочные мысли" порождаются исключительно недостаточным знанием "матчасти"... :-)
12 апр 07, 11:38    [4011032]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
SQL*Plus
Поэтому все "удивления" и "загодочные мысли" порождаются исключительно недостаточным знанием "матчасти"... :-)

ладно, время рассудит :)
13 апр 07, 15:33    [4018651]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Stax..
Guest
Dimkas
SQL*Plus
Поэтому все "удивления" и "загодочные мысли" порождаются исключительно недостаточным знанием "матчасти"... :-)

ладно, время рассудит :)

а могли и отсотировать и "кусты", лентяи, что непонятно как сортировать?
эти кусты могут запросто появлятся
.....
stax
13 апр 07, 15:58    [4018901]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Dimkas
Member

Откуда: Красноярск
Сообщений: 403
Stax..
Dimkas
SQL*Plus
Поэтому все "удивления" и "загодочные мысли" порождаются исключительно недостаточным знанием "матчасти"... :-)

ладно, время рассудит :)

а могли и отсотировать и "кусты", лентяи, что непонятно как сортировать?
эти кусты могут запросто появлятся
.....
stax

во-во
+1

:))
13 апр 07, 17:09    [4019524]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Elic
Member

Откуда:
Сообщений: 29990
Парни, я тоже слегка недоумеваю по поводу сортировки корней, однако же соплей не распускаю
13 апр 07, 19:29    [4020279]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Stax..
Guest
Elic
Парни, я тоже слегка недоумеваю по поводу сортировки корней, однако же соплей не распускаю

а причем тут сопли?
решение от оракле мягко говоря странное

если они не допускают "кусты" - то должен слитать селект с орой,
если допускают - то будьте добры упорядочить

зы
не ожидал такой заподляны
......
stax
13 апр 07, 20:55    [4020454]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Elic
Member

Откуда:
Сообщений: 29990
Stax..
решение от оракле мягко говоря странное
И тем не менее в полном соответствии с собственной документацией.
Stax..
не ожидал такой заподляны
обходится легко.
14 апр 07, 09:05    [4021143]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Stax..
Guest
Elic
Stax..
решение от оракле мягко говоря странное
И тем не менее в полном соответствии с собственной документацией.
Stax..
не ожидал такой заподляны
обходится легко.

из любопытства как простым методом обходится

SELECT
  lpad(' ',2*level-2)||ename e
 ,sal
 ,deptno
-- ,ename
FROM  (
SELECT  --просто пример подзапроса (от фонаря)
  sal
 ,ename
 ,deptno
 ,ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal desc,empno) rn
FROM  emp e
)
START WITH rn=1
CONNECT BY PRIOR rn+1=rn and prior deptno=deptno
ORDER SIBLINGS BY ename
/
E                          SAL    DEPTNO
-------------------- --------- ---------
KING                      5000        10
  CLARK                   2450        10
    MILLER                1300        10
SCOTT                     3000        20
  FORD                    3000        20
    JONES                 2975        20
      ADAMS               1100        20
        SMITH              800        20
BLAKE                     2850        30
  ALLEN                   1600        30
    TURNER                1500        30
      WARD                1250        30
        MARTIN            1250        30
          JAMES            950        30

14 rows selected.
......
stax
16 апр 07, 22:45    [4028556]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Elic
Member

Откуда:
Сообщений: 29990
Stax..
Elic
Stax..
не ожидал такой заподляны
обходится легко.
из любопытства как простым методом обходится
SELECT
  lpad(' ',2*level-2)||ename e
 ,sal
 ,deptno
-- ,ename
FROM  (
SELECT  --просто пример подзапроса (от фонаря)
  sal
 ,ename
 ,deptno
 ,ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal desc,empno) rn
FROM  emp e
union all select null, null, null, 0 from dual
)
where level > 1
START WITH rn = 0
CONNECT BY PRIOR rn+1=rn
  and (prior deptno = deptno or rn = 1)
ORDER SIBLINGS BY ename
;

E                                        SAL        DEPTNO
------------------------------ ------------- -------------
  BLAKE                                 2850            30
    ALLEN                               1600            30
      TURNER                            1500            30
        WARD                            1250            30
          MARTIN                        1250            30
            JAMES                        950            30
  KING                                  5000            10
    CLARK                               2450            10
      MILLER                            1300            10
  SCOTT                                 3000            20
    FORD                                3000            20
      JONES                             2975            20
        ADAMS                           1100            20
          SMITH                          800            20

14 rows selected.
18 апр 07, 10:25    [4034830]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 841
Заранее извиняюсь за поднятие старой темы, просто только что пришлось товарищу полчаса объяснять, как мне казалось очевидные вещи.
Stax..

а могли и отсотировать и "кусты", лентяи, что непонятно как сортировать?
эти кусты могут запросто появлятся
.....
stax

Ну и как же их интересно сортировать? Неужто по значению поля?
Написано же четко:
oracle.com
If you want to order rows of siblings of the same parent,
then use the ORDER SIBLINGS BY clause

Так почему оракл должен сортировать узлы на первом уровне, даже если они не одного родителя???
И неужели по вашей локиге в запросе:
with t as
(select 1 node, null parent_node from dual
union all
select 10 node, 1 parent_node from dual
union all
select 20 node, 1 parent_node from dual
union all
select 37 node, 20 parent_node from dual
union all
select 39 node, 20 parent_node from dual
union all
select 99 node, null parent_node from dual
union all
select 3 node, 99 parent_node from dual
union all
select 33 node, 3 parent_node from dual
union all
select 5 node, null parent_node from dual
union all
select 4 node, 5 parent_node from dual
union all
select 9 node, 4 parent_node from dual
union all
select 17 node, 4 parent_node from dual
union all
select 6 node, 5 parent_node from dual
union all
select 35 node, 6 parent_node from dual
union all
select 30 node, 6 parent_node from dual
union all
select 15 node, 10 parent_node from dual
union all
select 16 node, 10 parent_node from dual
)
SELECT LEVEL, lpad('~', 5 * LEVEL - 1, '_') || node
  FROM t
 START WITH node IN (1, 3, 5)
CONNECT BY PRIOR node = parent_node;
должен выводится сначала узел 1 с детьми, потом 3, потом 5???
node
___~3
________~33
___~1
________~10
_____________~15
_____________~16
________~20
_____________~37
_____________~39
___~5
________~4
_____________~9
_____________~17
________~6
_____________~35
_____________~30

В общем это, конечно, риторический вопрос. Но формулировка, что
ORDER SIBLINGS BY работает неожиданным образом я думаю неверна, т.к. она работает как раз четко по документации.
3 апр 08, 17:46    [5500691]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
Elic
Member

Откуда:
Сообщений: 29990
Кобанчег
Но формулировка, что
ORDER SIBLINGS BY работает неожиданным образом я думаю неверна, т.к. она работает как раз четко по документации.
Тема (не)сортировки корней в документации, к сожалению, не раскрыта. Иногда они сортируются, иногда нет. Может быть когда-нибудь я посвещу этой бесполезной, но просто интересной теме отдельную тему.
3 апр 08, 21:34    [5501529]     Ответить | Цитировать Сообщить модератору
 Re: ORDER SIBLINGS BY работает неожиданным образом  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63987
Блог
Кобанчег
Но формулировка, что ORDER SIBLINGS BY работает неожиданным образом я думаю неверна

Чтобы говорить, верна она или нет, нужно явно договориться "неожиданным образом относительно чего именно". Если "неожиданным относительно здравого смысла Васи Пупкина" - это одно, ну а если "неожиданным относительно документации" - это уже называется баг.
3 апр 08, 21:41    [5501542]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить