Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 иерархический запрос  [new]
anetgav
Member

Откуда:
Сообщений: 15
Всем добрый день!

Есть иерархический запрос

SELECT LEVEL,
atr.code_tree,
NAT.CODE_NODE_FATHER,
NAT.CODE_NODE,
LPAD (' ', 5 * LEVEL) || NAT.NAME_NODE NAME_NODE
FROM mz.node_alternative_trees nat, mz.alternative_trees atr
WHERE aTr.CODE_TREE = nat.code_tree
START WITH atr.code_tree = 2054
CONNECT BY PRIOR NAT.CODE_NODE = NAT.CODE_NODE_FATHER
ORDER SIBLINGS BY nat.name_node

В результате:

1 2054 -2054 2100 Напитки
2 2054 2100 2156 Алкогольные напитки
3 2054 2156 2158 Пиво
3 2054 2156 2159 Слабоалкогольные напитки
2 2054 2100 2157 Безалкогольные напитки
3 2054 2157 2160 Коктейли
3 2054 2157 2161 Минеральная вода

Но, как только пытаюсь связать еще с одной таблицей, 1, 2 уровни пропадают...

SELECT distinct
atr.code_tree,
NAT.CODE_NODE_FATHER,
NAT.CODE_NODE,
NAT.NAME_NODE NAME_NODE
FROM mz.node_alternative_trees nat,
mz.alternative_trees atr,
mz.link_node_to_group lng
WHERE aTr.CODE_TREE = nat.code_tree AND lng.CODE_NODE = nat.CODE_NODE
START WITH atr.code_tree = 2054
CONNECT BY PRIOR NAT.CODE_NODE = NAT.CODE_NODE_FATHER
ORDER SIBLINGS BY nat.name_node

2054 2156 2158 Пиво
2054 2156 2159 Слабоалкогольные напитки
2054 2157 2160 Коктейли
2054 2157 2161 Минеральная вода

а нужно по второму запросу вывести дерево, а не только нижние уровни...
Как быть? Подскажите, что не так...
30 май 11, 15:12    [10732321]     Ответить | Цитировать Сообщить модератору
 Re: иерархический запрос  [new]
LexMinsk
Member

Откуда: Republic of Belarus
Сообщений: 451
Сделайте через подзапрос или вьюшку.
30 май 11, 15:29    [10732509]     Ответить | Цитировать Сообщить модератору
 Re: иерархический запрос  [new]
donner-gms
Member [заблокирован]

Откуда:
Сообщений: 1701
anetgav
а нужно по второму запросу вывести дерево, а не только нижние уровни...
Как быть? Подскажите, что не так...


не совать в where что попало.

подзапрос с with спасёт отца русской демократии
30 май 11, 15:43    [10732677]     Ответить | Цитировать Сообщить модератору
 Re: иерархический запрос  [new]
Awkward
Member

Откуда:
Сообщений: 76
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.

http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/queries003.htm#i2053935

Т.е. where отрабатывает уже после того, как построено дерево.

Если хочешь учесть какое-то условие в процессе построения дерева - его нужно помещать в connect by,
но в такую логику не все укладывается.

Альтернатива - подзапросы во фразе from либо рекурсивные with.
30 май 11, 18:01    [10734110]     Ответить | Цитировать Сообщить модератору
 Re: иерархический запрос  [new]
anetgav
Member

Откуда:
Сообщений: 15
Выкинула одну таблицу, подзапрос есть - получилось, спасибо за толчок))

Ответьте, пожалуйста, еще на такой вопрос... или киньте ссылку, где почитать.
Почему в иерархическом запросе, если добавить rownum, то нумерация идет не сначала? не с 1, а например с 96.
И выбрать первые 20 строк невозможно... выбирает совсем не то, или просто выдает пустые строки.
30 май 11, 18:39    [10734310]     Ответить | Цитировать Сообщить модератору
 Re: иерархический запрос  [new]
Awkward
Member

Откуда:
Сообщений: 76
anetgav,

http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/pseudocolumns009.htm#i1006297

Если ты пишешь что-то вроде

select distinct rownum, col1
from t

то это ошибка - дубликаты по col1 не удалятся и rownum перемешается из-за сортировки


Для получения top-Т:

This is sometimes referred to as top-N reporting:

SELECT *
FROM (SELECT * FROM employees ORDER BY employee_id)
WHERE ROWNUM < 11;
30 май 11, 19:32    [10734564]     Ответить | Цитировать Сообщить модератору
 Re: иерархический запрос  [new]
mayton
Member

Откуда: loopback
Сообщений: 49811
anetgav,

чтобы иметь возможность показывать планы в текстовом виде надо

1) Создать таблицу для планов.

SQL> $ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL;

2) Использовать explain

SQL> EXPLAIN PLAN FOR
  Your_SQL_Statement;

3) Смотреть через скриптик
SQL> set linesize 134
SQL> set pagesize 10000
SQL> $ORACLE_HOME/RDBMS/ADMIN/UTLXPLS.SQL;

или запросами по таблице PLAN_TABLE как описано здесь

http://download.oracle.com/docs/cd/B10500_01/server.920/a96533/ex_plan.htm
30 май 11, 23:03    [10735368]     Ответить | Цитировать Сообщить модератору
 Re: иерархический запрос  [new]
Elic
Member

Откуда:
Сообщений: 29990
mayton
1) Создать таблицу для планов.

SQL> $ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL;
catplan.sql
31 май 11, 08:21    [10736230]     Ответить | Цитировать Сообщить модератору
 Re: иерархический запрос  [new]
mayton
Member

Откуда: loopback
Сообщений: 49811
Я не против.

P.S. И забыл добавить @...
31 май 11, 14:58    [10739145]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить