Сортировка родителей и деток

aidynchik
Дата: 02.12.2009 12:49:27
Имеется таблица банков, которая на рисунке, нужно отсортировать сначала родителей по колонке SHORT_NAME, а затем внутри каждого родителя отсортировать детей по колонке BCODE, возможно ли такое?
я пишу так:
select level, b.gs_bank, b.parent_id, lpad(' ', 3*level)||b.short_name short_name, b.bcode
from gs_bank b
where b.is_active = 1
start with b.parent_id is null
connect by prior b.gs_bank = b.parent_id
order SIBLINGS by b.Short_Name

и он естественно сортирует ВСЕ по Short_Name... если напишу

select level, b.gs_bank, b.parent_id, lpad(' ', 3*level)||b.short_name short_name, b.bcode
from gs_bank b
where b.is_active = 1
start with b.parent_id is null
connect by prior b.gs_bank = b.parent_id
order SIBLINGS by b.BCODE
то все отсортируется по BCODE... пытался писать через запятую, эффекта 0. что подскажете
Andrey.L
Дата: 02.12.2009 13:03:35
aidynchik,
select level, b.gs_bank, b.parent_id, lpad(' ', 3*level)||b.short_name short_name, b.bcode
from gs_bank b
where b.is_active = 1
start with b.parent_id is null
connect by prior b.gs_bank = b.parent_id
order SIBLINGS by decode(level,1,b.Short_Name, b.bcode)
выделенное вызывает сомнения
Elic
Дата: 02.12.2009 13:05:47
aidynchik
нужно отсортировать сначала родителей по колонке SHORT_NAME, а затем внутри каждого родителя отсортировать детей по колонке BCODE, возможно ли такое?
Да.
Только надо помнить, что siblings-ом корни не сортируются. Чтобы сортировать и корни, надо (искуственно) вводить суперь-корень. И тогда:
...
where level > 1
...
order siblings by decode(level, 2, short_name), bcode
aidynchik
Дата: 02.12.2009 13:06:10
Andrey.L
aidynchik,
select level, b.gs_bank, b.parent_id, lpad(' ', 3*level)||b.short_name short_name, b.bcode
from gs_bank b
where b.is_active = 1
start with b.parent_id is null
connect by prior b.gs_bank = b.parent_id
order SIBLINGS by decode(level,1,b.Short_Name, b.bcode)
выделенное вызывает сомнения

а, тьфу забыл удалить - можешь на это не обращать внимания, это просто признак типа утвержден/не утвержден
aidynchik
Дата: 02.12.2009 13:09:57
все заработало - то, что нужно :) и как я сам не додумался до такого? :)
всем спс
Maxifly
Дата: 02.12.2009 17:05:20
а это не то же самое достигается с использованием


order by connect_by_root, bcode
ORA-00976
Дата: 02.12.2009 17:09:16
Elic
aidynchik
нужно отсортировать сначала родителей по колонке SHORT_NAME, а затем внутри каждого родителя отсортировать детей по колонке BCODE, возможно ли такое?
Да.
Только надо помнить, что siblings-ом корни не сортируются. Чтобы сортировать и корни, надо (искуственно) вводить суперь-корень. И тогда:
...
where level > 1
...
order siblings by decode(level, 2, short_name), bcode


ORA-00976: LEVEL, PRIOR, or ROWNUM not allowed here
Elic
Дата: 02.12.2009 17:50:36
ORA-00976
Elic
order siblings by decode(level, 2, short_name), bcode
ORA-00976: LEVEL, PRIOR, or ROWNUM not allowed here
order siblings by decode(parent_id, null, short_name), bcode
SY
Дата: 02.12.2009 18:33:19
Maxifly
а это не то же самое достигается с использованием
order by connect_by_root, bcode


Did you test it? Very buggy. For example:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select  lpad(' ',level*2) || ename ename,
  2          job,
  3          sal
  4    from  emp
  5    start with mgr is null
  6    connect by mgr = prior empno
  7    order siblings by connect_by_root(job),sal
  8  /
        sal
        *
ERROR at line 3:
ORA-00600: internal error code, arguments: [qkacon:FJswrwo], [1], [], [], [],
[], [], []


SQL> select  lpad(' ',level*2) || ename ename,
  2          job,
  3          sal
  4    from  emp
  5    start with mgr is null
  6    connect by mgr = prior empno
  7    order siblings by connect_by_root(job),ename
  8  /
  order siblings by connect_by_root(job),ename
                                         *
ERROR at line 7:
ORA-00976: LEVEL, PRIOR, or ROWNUM not allowed here


SQL> select  lpad(' ',level*2) || ename enameX,
  2          job,
  3          sal
  4    from  emp
  5    start with mgr is null
  6    connect by mgr = prior empno
  7    order siblings by connect_by_root(job),ename
  8  /
        sal
        *
ERROR at line 3:
ORA-00600: internal error code, arguments: [qkacon:FJswrwo], [1], [], [], [],
[], [], []


SQL> select  lpad(' ',level*2) || ename ename,
  2          job,
  3          sal salX
  4    from  emp
  5    start with mgr is null
  6    connect by mgr = prior empno
  7    order siblings by connect_by_root(job),sal
  8  /
        sal salX
        *
ERROR at line 3:
ORA-03113: end-of-file on communication channel


SQL> connect scott/tiger
Connected.
SQL> select  lpad(' ',level*2) || ename ename,
  2          job,
  3          sal salX
  4    from  emp
  5    start with mgr is null
  6    connect by mgr = prior empno
  7    order siblings by connect_by_root(job),salX
  8  /
        sal salX
        *
ERROR at line 3:
ORA-00600: internal error code, arguments: [qkacon:FJswrwo], [1], [], [], [],
[], [], []


SQL> 

SY.
SY
Дата: 02.12.2009 18:39:34
SY
Did you test it? Very buggy. For example:


Found the fix:

SQL> select  /*+ NO_CONNECT_BY_COST_BASED */
  2          lpad(' ',level*2) || ename enamex,
  3         job,
  4         sal salX
  5   from  emp
  6   start with mgr is null
  7   connect by mgr = prior empno
  8   order siblings by connect_by_root(job),ename
  9  /

ENAMEX                         JOB             SALX
------------------------------ --------- ----------
  KING                         PRESIDENT       5000
    BLAKE                      MANAGER         2850
      ALLEN                    SALESMAN        1600
      JAMES                    CLERK            950
      MARTIN                   SALESMAN        1250
      TURNER                   SALESMAN        1500
      WARD                     SALESMAN        1250
    CLARK                      MANAGER         2450
      MILLER                   CLERK           1300
    JONES                      MANAGER         2975
      FORD                     ANALYST         3000

ENAMEX                         JOB             SALX
------------------------------ --------- ----------
        SMITH                  CLERK            800
      SCOTT                    ANALYST         3000
        ADAMS                  CLERK           1100

14 rows selected.

SQL> 

SY.