powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / The Power of Oracle SQL
25 сообщений из 108, страница 2 из 5
The Power of Oracle SQL
    #39396763
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HelpMePlsRegular expression - было бы хорошо добавить. или не было заметок?Так регулярки - это не SQL, получается отклонение от темы.

Материалов масса, вплоть до оракловых White Paper - Introducing Oracle Regular Expressions .
Интереснее было бы написать сравнение оракловой реализации скажем, с perl, чтоб показать ограниченность первой.
Для этого легко можно подобрать с десяток реальных задач даже только с этого форума.
Я как-то публиковал краткий обзор Evolution of regular expressions . Дальше развивать тему не особо интересно.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39399045
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

83 страница:
Например, имеет информация по продажам за 12 месяцев и надо для каждого месяца
отношение объема продаж к значению для первого месяца.
...
select id, value, value / min(value) over() ratio from t

может first_value(value) over() ?
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39399083
moishamiem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

Почту отправить не могу, поэтому пишу отзыв сюда.

1) Отличная глава про джоины! К стыду своему узнал кое-что новенькое в такой, скажем, базовой теме. А остальное отлично разложено по полочкам, не грех повторить и уложить в голове лишний раз.

2) А вот самые интересные для меня главы про model и match_recogzine показались слабее. Я не мастер model, но не нашел почти ничего нового и полезного по сравнению со старенькой статьей на Хабре ( https://habrahabr.ru/post/101003/), которая, как мне кажется, более доступна людям, не знакомых с данным оператором.

3) Почему мне так кажется? Потому что к главе про match_recogzine я подошел абсолютно нулевым, в надежде первый раз узнать про данный чудо-оператор, и... ничего не понял. Совсем. Ну, первая моя мысль, что наверно я просто туплю, но, как оказалось, достаточно быстро нагугливается переведенная статья Кайта ( http://www.fors.ru/upload/magazine/09/http_text/fors_article_kyte.html), которая разбирает похожий пример, но делает это гораздо, гораздо понятней и наглядней. После данной статьи я снова перечитал главу из книги, и пришел к тому же выводу что и для главы про model: не знакомому понятно сложно, а знакомый не найдет много нового и полезного.

В общем, хочется больше поясняющего текста, более плавный переход от простого к сложному.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39399251
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moishamiem2) А вот самые интересные для меня главы про model и match_recogzine показались слабее. Я не мастер model, но не нашел почти ничего нового и полезного по сравнению со старенькой статьей на Хабре ( https://habrahabr.ru/post/101003/), которая, как мне кажется, более доступна людям, не знакомых с данным оператором.Ну давай разложим по полочкам. Начнем с хабровской статьи.

Прежде всего неверно отражена суть с самого старта
Модель для "подсчёт промежуточных итогов по подгруппам, ..., сложное форматирование строк"?Далее:
Аналитические функции внутри правил запрещены.Да?
Применение конструкции MODEL запрещает использовать агрегатные функции внутри других блоков SELECT.Что?
Важно знать, что UPSERT ALL работает...Не так он работает.
Директива AUTOMATIC ORDER используется для того, чтобы p1 и p2 считались по очереди для текущего отрезка.Категорически неверно. Правила всегда вычисляются по столбцам а не строкам.
С производительностью всё просто.Только написана полная чепуха.

Стоит заметить, что хабровская аудитория отлично проглотила статью, а другого я от неё и не ожидал.

Я ничего не увидел про ссылочные (reference) модели, про несходимые модели (does not converge) и множество прочих деталей от ограничений на правила до особенностей итеративных моделей.
Анализ производительности нельзя воспринимать всерьез.

moishamiem3) Почему мне так кажется? Потому что к главе про match_recogzine я подошел абсолютно нулевым, в надежде первый раз узнать про данный чудо-оператор, и... ничего не понял. Совсем. Ну, первая моя мысль, что наверно я просто туплю, но, как оказалось, достаточно быстро нагугливается переведенная статья Кайта ( http://www.fors.ru/upload/magazine/09/http_text/fors_article_kyte.html), которая разбирает похожий пример, но делает это гораздо, гораздо понятней и наглядней. После данной статьи я снова перечитал главу из книги, и пришел к тому же выводу что и для главы про model: не знакомому понятно сложно, а знакомый не найдет много нового и полезного.У Кайта было про сравнение с аналитикой? Или про ограничения? Или про фишку с permute? Или про {--} и "with unmatched rows"? Etc.
А хоть краткий обзор производительности? (в эту тему будет некоторое углубление во второй части)

moishamiemВ общем, хочется больше поясняющего текста, более плавный переход от простого к сложному.Учитывая аргументацию и выводы, я полагаю, что ты до сих пор не очень понял ни model ни pattern matching.
В том смысле для чего инструмент, что с помощью него можно решить, а что нет и базовые best practices.
Формулировки "мне кажется" или "ничего не понял" это на уровне домохозяйки, которая звонит в тех поддержку.
У других отозвавшихся именно по этим двум разделам были диаметрально противоположные отзывы, но я подумаю как сделать текст более понятным.
Текущий объем 114 страниц, и полагаю, чтоб реализовать "более плавный переход от простого к сложному" надо страниц 250. Это не выход. Чтение подразумевает пользование гуглом при необходимости.
Ну и я отдаю себе отчет, что в повествовании делается достаточно быстрое погружение в тонкости, так что у меня нет иллюзий что книга будет интересна не разработчикам БД. Даже толковый джавист или сишарпник быстро отложит в сторону с вердиктом "ничего нипанятна".
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39399252
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
moishamiem,

Ну и спасибо за отзыв. Без обид. Я понимаю, что всем всё равно не угодишь.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39399259
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
piheldbms_photoshop,

83 страница:
Например, имеет информация по продажам за 12 месяцев и надо для каждого месяца
отношение объема продаж к значению для первого месяца.
...
select id, value, value / min(value) over() ratio from t

может first_value(value) over() ?Да, спасибо, надо поправить.
либо
Код: plaintext
first_value(value) over (order by id)
либо
Код: plaintext
min(value)  keep (dense_rank first order by id)  over ()
да хоть nth_value. :)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39399289
moishamiem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

Да, конечно, без обид. Автору виднее как и для кого писать.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39426845
фотошоп нагенерировал фибоначчи через connect by, а столько воплей раньше было, что это невозможно))

про модель просто шикарно)

когда вторая часть?
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39427417
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Стр. 7До версии 9i в Oracle не было поддержки ANSI соединений, поэтому для соединения
таблиц, их имена необходимо было перечислить во from и указать условия соединения в where.
Oracle-specific syntax для соединений был впервые реализован в версии Oracle 6 .
В ORACLE v5 и v4 был такой синтаксис.
Предполагаю, что он же был и раньше.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39427454
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оси лил целикомкогда вторая часть?По не зависящим от меня обстоятельствам несколько изменились приоритеты. Но работа потихоньку идет. Осталась одна глава и итоговая версия ожидается до конца апреля.
SQL*Plusdbms_photoshop,

Стр. 7До версии 9i в Oracle не было поддержки ANSI соединений, поэтому для соединения
таблиц, их имена необходимо было перечислить во from и указать условия соединения в where.
Oracle-specific syntax для соединений был впервые реализован в версии Oracle 6 .
В ORACLE v5 и v4 был такой синтаксис.
Предполагаю, что он же был и раньше.Я подразумевал внешние соединения, но из процитированного абзаца это совершенно непонятно. Надо переформулировать. Спасибо.
https://blogs.oracle.com/optimizer/entry/outerjoins_in_oracle ince release 6, Oracle has supported a restricted form of left outerjoin, which uses Oracle-specific syntax. In 9i, Oracle introduced support for ANSI SQL 92/99 syntax for inner joins and various types of outerjoin.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39427527
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

Спасибо за книгу!=)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39428092
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopоси лил целикомкогда вторая часть?По не зависящим от меня обстоятельствам несколько изменились приоритеты. Но работа потихоньку идет. Осталась одна глава и итоговая версия ожидается до конца апреля.
SQL*Plusdbms_photoshop,

пропущено...

В ORACLE v5 и v4 был такой синтаксис.
Предполагаю, что он же был и раньше.Я подразумевал внешние соединения, но из процитированного абзаца это совершенно непонятно. Надо переформулировать. Спасибо.
https://blogs.oracle.com/optimizer/entry/outerjoins_in_oracle ince release 6, Oracle has supported a restricted form of left outerjoin, which uses Oracle-specific syntax. In 9i, Oracle introduced support for ANSI SQL 92/99 syntax for inner joins and various types of outerjoin.Посмотрю сохранившуюся документацию по ORACLE v5 в переводе РДТеХ..
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431073
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Спасибо за статью!!!

осилил

не знал о dbms_sql2.expand_sql_text


не понял фразы
стр 41
Если <order by> указано, то окно определяется от первой строки секции
и до текущей


если не указано другое

стр54
Подобная сортировка не гарантирует сортировку корневых узлов, поскольку нельзя сказать, что они имеют общего родителя.

имхо, ето был баг

Код: plsql
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.
  1  select empno,LPAD (' ', LEVEL * 2, ' ')||ename tree,mgr,level,ename
  2  from emp e
  3  --where level<=1 and level<=0
  4  start with mgr --is null
  5  in (7839)
  6  connect by NOCYCLE e.mgr = prior e.empno
  7* order siblings by ename
SQL> /

     EMPNO TREE                        MGR      LEVEL ENAME
---------- -------------------- ---------- ---------- ---------------------
      7698   BLAKE                    7839          1 BLAKE
      7499     ALLEN                  7698          2 ALLEN
      7900     JAMES                  7698          2 JAMES
      7654     MARTIN                 7698          2 MARTIN
      7844     TURNER                 7698          2 TURNER
      7521     WARD                   7698          2 WARD
      7782   CLARK                    7839          1 CLARK
      7934     MILLER                 7782          2 MILLER
      7566   JONES                    7839          1 JONES
      7902     FORD                   7566          2 FORD
      7369       SMITH                7902          3 SMITH
      7788     SCOTT                  7566          2 SCOTT
      7876       ADAMS                7788          3 ADAMS

13 rows selected.


стр 56
То есть если в условие соединения добавить level <= 1 и level <= 0,
то в любом случае будут возвращены все строки первого уровня.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  1  select empno,LPAD (' ', LEVEL * 2, ' ')||ename ename,mgr,level
  2  --,connect_by_isleaf isleaf
  3  --,CONNECT_BY_ISCYCLE  iscycle
  4  from emp e
  5  where level<=1 and level<=0
  6  start with mgr is null
  7* connect by NOCYCLE e.mgr = prior e.empno
SQL> /

no rows selected



стр 57
Ключевой момент при использовании connect by - это то, что невозможно генерировать дочерние значения на основании родительских.

возможно имелось ввиду ВЫЧИСЛЕННЫХ родительских


стр
Для того, что выводились сначала дочерние элементы текущего узла, а потом остальные элементы на том же уровне необходимо использовать конструкцию search depth first - иными словами выполняется обход в глубину. По умолчанию результат выводится по уровням (search breadth first) - обход в ширину. Подобное поведение нельзя контролировать для connect by, при котором обход всегда выполняется в глубину.


невозможно что сделать?



стр 75
Всегда имеет смысл указывать сортировку в левой части правил содержащих диапазоны ячеек, поскольку
- в таком случае улучшается производительность

почему улучшается?


стр 93
какую задачу решает пример (хотел проверить на 94стр )


еще раз
СПАСИБО за труд


ps
если не трудно прономеровать примеры (сквозная или по разделам номерация)

.....
stax
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431097
stax.. стр 56
То есть если в условие соединения
добавить level <= 1 и level <= 0,
то в любом случае будут возвращены все строки первого уровня.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  1  select empno,LPAD (' ', LEVEL * 2, ' ')||ename ename,mgr,level
  2  --,connect_by_isleaf isleaf
  3  --,CONNECT_BY_ISCYCLE  iscycle
  4  from emp e
  5  where level<=1 and level<=0
  6  start with mgr is null
  7* connect by NOCYCLE e.mgr = prior e.empno
SQL> /

no rows selected
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431119
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
условие совокупленияstax.. стр 56
То есть если в условие соединения
добавить level <= 1 и level <= 0,
то в любом случае будут возвращены все строки первого уровня.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  1  select empno,LPAD (' ', LEVEL * 2, ' ')||ename ename,mgr,level
  2  --,connect_by_isleaf isleaf
  3  --,CONNECT_BY_ISCYCLE  iscycle
  4  from emp e
  5  where level<=1 and level<=0
  6  start with mgr is null
  7* connect by NOCYCLE e.mgr = prior e.empno
SQL> /

no rows selected


не понял, какого (чего) соеденения?
Код: plsql
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.
28.
29.
  1  select empno,LPAD (' ', LEVEL * 2, ' ')||ename tree,mgr,level,ename
  2  from emp e, (select empno r from emp where mgr=7839) rr
  3  where  e.empno=rr.r(+)
  4  and level<=1
  5  --and level<=0
  6  start with r is not null --(7839)
  7  connect by NOCYCLE e.mgr = prior e.empno
  8* order siblings by ename
SQL> /

     EMPNO TREE                        MGR      LEVEL ENAME
---------- -------------------- ---------- ---------- ----------------------------------------
      7698   BLAKE                    7839          1 BLAKE
      7782   CLARK                    7839          1 CLARK
      7566   JONES                    7839          1 JONES

SQL> ed
Wrote file afiedt.buf

  1  select empno,LPAD (' ', LEVEL * 2, ' ')||ename tree,mgr,level,ename
  2  from emp e, (select empno r from emp where mgr=7839) rr
  3  where  e.empno=rr.r(+)
  4  and level<=1 and level<=0
  5  start with r is not null --(7839)
  6  connect by NOCYCLE e.mgr = prior e.empno
  7* order siblings by ename
SQL> /

no rows selected



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

......
stax
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431156
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..не понял фразы
стр 41
Если <order by> указано, то окно определяется от первой строки секции
и до текущей


если не указано другоеИмелось в виду, что
Код: plaintext
order by ...
эквивалентно
Код: plaintext
order by ... rows between unbounded preceding and current row
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as
(select rownum id, value(t) value from table(sys.odcinumberlist(1,10,100)) t)
select 
id,
sum(value) over (order by id) s11,
sum(value) over (order by id rows between unbounded preceding and current row) s12,
sum(value) over () s21,
sum(value) over (order by id rows between unbounded preceding and unbounded following) s22
from t
order by id;


Код: plsql
1.
2.
3.
4.
5.
6.
7.
        ID        S11        S12        S21        S22
---------- ---------- ---------- ---------- ----------
         1          1          1        111        111
         2         11         11        111        111
         3        111        111        111        111

3 rows selected.


stax..стр54
Подобная сортировка не гарантирует сортировку корневых узлов, поскольку нельзя сказать, что они имеют общего родителя.

имхо, ето был багПокажи где в доке/металинке указано, что гарантирует или что то был баг.
stax.. стр 56
То есть если в условие соединения добавить level <= 1 и level <= 0,
то в любом случае будут возвращены все строки первого уровня.
Запрос не возвращает строк не из-за условия соединения, а из-за того, что условие старта не возвращает ни одной строки.
Иными словами: если условие старта возвращает некоторые строки, а условие соединения заведомо ложное, то результат не будет пустым.
stax..стр 57
Ключевой момент при использовании connect by - это то, что невозможно генерировать дочерние значения на основании родительских.

возможно имелось ввиду ВЫЧИСЛЕННЫХ родительскихДа, так точнее.
У меня эта формулировка встречалась несколько раз, вероятно в одном из случаев сформулировано недостаточно точно.
stax..стр
Для того, что выводились сначала дочерние элементы текущего узла, а потом остальные элементы на том же уровне необходимо использовать конструкцию search depth first - иными словами выполняется обход в глубину. По умолчанию результат выводится по уровням (search breadth first) - обход в ширину. Подобное поведение нельзя контролировать для connect by, при котором обход всегда выполняется в глубину.


невозможно что сделать?Невозможно обойти дерево в ширину с помощью connect by.
Можно rec with или моделью для любителей экзотики.

stax..стр 75
Всегда имеет смысл указывать сортировку в левой части правил содержащих диапазоны ячеек, поскольку
- в таком случае улучшается производительность

почему улучшается?stax.. какую задачу решает пример (хотел проверить на 94стр ) На эти два момента позже отвечу. Пора бежать.

Спасибо за отзыв.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431169
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

авторПокажи где в доке/металинке указано, что гарантирует или что то был баг.
наоборот, где сказано что левел 1 не сортируется

имхо был баг, Елик предлагал искуственно вводить корень

авторЗапрос не возвращает строк не из-за условия соединения, а из-за того, что условие старта не возвращает ни одной строки.
Иными словами: если условие старта возвращает некоторые строки, а условие соединения заведомо ложное, то результат не будет пустым.

не понимаю я русский

стартовый возвращает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SQL> select empno,LPAD (' ', LEVEL * 2, ' ')||ename tree,mgr,level,ename
  2  from emp e, (select empno r from emp where mgr=7839) rr
  3  where  e.empno=rr.r(+)
  4  and level<=1
  5  --and level<=0
  6  start with r is not null --(7839)
  7  connect by NOCYCLE e.mgr = prior e.empno
  8  order siblings by ename
  9  /

     EMPNO TREE                        MGR      LEVEL ENAME
---------- -------------------- ---------- ---------- ----------------------
      7698   BLAKE                    7839          1 BLAKE
      7782   CLARK                    7839          1 CLARK
      7566   JONES                    7839          1 JONES


стартовый вернул три строки
добавляю (раскоментирую) level<=0
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> ed
Wrote file afiedt.buf

  1  select empno,LPAD (' ', LEVEL * 2, ' ')||ename tree,mgr,level,ename
  2  from emp e, (select empno r from emp where mgr=7839) rr
  3  where  e.empno=rr.r(+)
  4  and level<=1
  5  and level<=0
  6  start with r is not null --(7839)
  7  connect by NOCYCLE e.mgr = prior e.empno
  8* order siblings by ename
SQL> /

no rows selected


где то результат не будет пустым ?

Код: plsql
1.
2.
Невозможно обойти дерево в ширину с помощью connect by.
Можно rec with или моделью для любителей экзотики.



понятно что разные алгоритмы (и разные для разных версий оракля), но не проблема ж с имитацией

вширь connect by
Код: plsql
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.
  1  select empno,LPAD (' ', LEVEL * 2, ' ')||ename tree,mgr,level
  2  from emp e
  3  start with mgr is null
  4  connect by NOCYCLE e.mgr = prior e.empno
  5* order by level,ename
SQL> /

     EMPNO TREE                        MGR      LEVEL
---------- -------------------- ---------- ----------
      7839   KING                                   1
      7698     BLAKE                  7839          2
      7782     CLARK                  7839          2
      7566     JONES                  7839          2
      7499       ALLEN                7698          3
      7902       FORD                 7566          3
      7900       JAMES                7698          3
      7654       MARTIN               7698          3
      7934       MILLER               7782          3
      7788       SCOTT                7566          3
      7844       TURNER               7698          3
      7521       WARD                 7698          3
      7876         ADAMS              7788          4
      7369         SMITH              7902          4

14 rows selected.



Кстати надо проверить обходит ли with вглубь,
терзают меня смутные сомнения


ps
как копировать отмеченное в хххх?

......
stax
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431194
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..
Кстати надо проверить обходит ли with вглубь,
терзают меня смутные сомнения

......
stax
создаем ф-цію, будет запомінать последовательнось вызовов
в формате <id/level.rownum)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or replace function stax_foto(p_p varchar2,p_l int :=0,p_r int :=0)
return varchar2
is
  v varchar2(4000);
begin
 if p_l=1 and p_r=1 then 
   DBMS_APPLICATION_INFO.SET_CLIENT_INFO('');
 end if;
 v:=userenv('client_info')||'<'||p_p||'/'||p_l||'.'||p_r||'> ';
 DBMS_APPLICATION_INFO.SET_CLIENT_INFO(v);
 return v;
end;
/



выполняем рекурсивный with в ширину
Код: plsql
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
with tree as (
select 2 id, 1 id_parent from dual union all
select 3 id, 1 id_parent from dual union all
select 4 id, 3 id_parent from dual union all
select 5 id, 4 id_parent from dual union all
select 11 id, 10 id_parent from dual union all
select 12 id, 11 id_parent from dual union all
select 13 id, 11 id_parent from dual )
, rec(lvl, id, id_parent, grand_parent, p) as (
 select
   1 lvl, id, id_parent,cast(null as number)
-- ,'<'||id||'/1.'||rownum||'> '
  ,stax_foto(id,1,rownum)
 from tree where id_parent in (1, 10)
 union all
 select r.lvl + 1, t.id, t.id_parent, r.id_parent
--       ,r.p||'<'||t.id||'/'||(r.lvl + 1)||'.'||rownum||'> '
 ,stax_foto(t.id,r.lvl+1,rownum)
from
 tree t join rec r on t.id_parent = r.id
)
--search depth first by id set ord
select
  lvl
 ,rpad(' ', (lvl - 1) * 3, ' ') || id as id, id_parent, grand_parent
 ,p
from rec
/

SQL> /

       LVL ID          ID_PARENT GRAND_PARENT P
---------- ---------- ---------- ------------ ----------------------------------------------------------------
         1 2                   1              <2/1.1>
         1 3                   1              <2/1.1> <3/1.2>
         1 11                 10              <2/1.1> <3/1.2> <11/1.3>
         2    4                3            1 <2/1.1> <3/1.2> <11/1.3> <4/2.1>
         2    13              11           10 <2/1.1> <3/1.2> <11/1.3> <4/2.1> <13/2.2>
         2    12              11           10 <2/1.1> <3/1.2> <11/1.3> <4/2.1> <13/2.2> <12/2.3>
         3       5             4            3 <2/1.1> <3/1.2> <11/1.3> <4/2.1> <13/2.2> <12/2.3> <5/3.1>


надеюсь траса понятна
сначала первый уровень (2,3,11), потом второй (4,13,12, причем, 13 перед 12, нет сортировки), ..., последним третий уровень 5
все согласно построения вширь

добавляю search depth first by id set ord

Код: plsql
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
SQL> with tree as (
  2  select 2 id, 1 id_parent from dual union all
  3  select 3 id, 1 id_parent from dual union all
  4  select 4 id, 3 id_parent from dual union all
  5  select 5 id, 4 id_parent from dual union all
  6  select 11 id, 10 id_parent from dual union all
  7  select 12 id, 11 id_parent from dual union all
  8  select 13 id, 11 id_parent from dual )
  9  , rec(lvl, id, id_parent, grand_parent, p) as (
 10   select
 11     1 lvl, id, id_parent,cast(null as number)
 12  -- ,'<'||id||'/1.'||rownum||'> '
 13    ,stax_foto(id,1,rownum)
 14   from tree where id_parent in (1, 10)
 15   union all
 16   select r.lvl + 1, t.id, t.id_parent, r.id_parent
 17  --       ,r.p||'<'||t.id||'/'||(r.lvl + 1)||'.'||rownum||'> '
 18   ,stax_foto(t.id,r.lvl+1,rownum)
 19  from
 20   tree t join rec r on t.id_parent = r.id
 21  )
 22  search depth first by id set ord
 23  select
 24    lvl
 25   ,rpad(' ', (lvl - 1) * 3, ' ') || id as id, id_parent, grand_parent
 26   ,p
 27  from rec
 28  /

       LVL ID          ID_PARENT GRAND_PARENT P
---------- ---------- ---------- ------------ ---------------------------------------------------------------
         1 2                   1              <2/1.1>
         1 3                   1              <2/1.1> <3/1.2>
         2    4                3            1 <2/1.1> <3/1.2> <11/1.3> <4/2.1>
         3       5             4            3 <2/1.1> <3/1.2> <11/1.3> <4/2.1> <13/2.2> <12/2.3> <5/3.1>
         1 11                 10              <2/1.1> <3/1.2> <11/1.3>
         2    12              11           10 <2/1.1> <3/1.2> <11/1.3> <4/2.1> <13/2.2> <12/2.3>
         2    13              11           10 <2/1.1> <3/1.2> <11/1.3> <4/2.1> <13/2.2>

7 rows selected.



и что мы видим траса не изменилась, банально оракля вывел аля connect by siblings
если бы обход шел вглубь то напр для 4 было бы <2/1.1> <3/1.2> <4/2.1> и тд

пример в глубь
Код: plsql
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.
28.
with tree as (
select 3 id, 1 id_parent from dual union all
select 4 id, 3 id_parent from dual union all
select 5 id, 4 id_parent from dual union all
select 2 id, 1 id_parent from dual union all
select 11 id, 10 id_parent from dual union all
select 12 id, 11 id_parent from dual union all
select 13 id, 11 id_parent from dual )
select level lvl,rpad(' ', (level - 1) * 3, ' ') || id as id_txt,id_parent
  ,stax_foto(id,1,rownum) p
 from tree
 start with id_parent in (1, 10)
 connect by id_parent=prior id
order siblings by id
/
SQL> /

       LVL ID_TXT      ID_PARENT P
---------- ---------- ---------- ------------------------------------------------------------
         1 2                   1 <2/1.1>
         1 3                   1 <2/1.1> <3/1.2>
         2    4                3 <2/1.1> <3/1.2> <4/1.3>
         3       5             4 <2/1.1> <3/1.2> <4/1.3> <5/1.4>
         1 11                 10 <2/1.1> <3/1.2> <4/1.3> <5/1.4> <11/1.5>
         2    12              11 <2/1.1> <3/1.2> <4/1.3> <5/1.4> <11/1.5> <12/1.6>
         2    13              11 <2/1.1> <3/1.2> <4/1.3> <5/1.4> <11/1.5> <12/1.6> <13/1.7>

7 rows selected.



как и ожидалось
первый уровень 2, нет детей переходим к 3-ке
дальше детят 3, детя 4,... у 5 нет детей,
опускаемся на уровень ниже до уровня 1,
след 11, его дети,..., опускаеся уровнями ниже
строк нет, выход

.....
stax
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431212
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopstax..не понял фразы
стр 41
Если <order by> указано, то окно определяется от первой строки секции
и до текущей


если не указано другоеИмелось в виду, что
Код: plaintext
order by ...
эквивалентно
Код: plaintext
order by ... rows between unbounded preceding and current row

Это не совсем так, default windowing clause -
Код: plaintext
order by ... range between unbounded preceding and current row

Regards

Maxim
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431222
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Demenko,
очепятался rows - range

.....
stax
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431268
row_number()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Demenko default windowing clause -
Код: plaintext
order by ... range between unbounded preceding and current row
не для всегда.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431380
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..стартовый вернул три строки
добавляю (раскоментирую) level<=0Давай вернемся к тому, что написал я
Еще одним важным моментом является то, что проверка условия connect by выполняется
после возврата строк на текущем уровне. То есть если в условие соединения добавить level <= 1 и
level <= 0, то в любом случае будут возвращены все строки первого уровня. Строки первого уровня
должны удовлетворять условиям start with и where если таковые имеются. условие соединения - предикат в connect by
условие фильтрации - предикат в where
Выполни это
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select empno,LPAD (' ', LEVEL * 2, ' ')||ename tree,mgr,level,ename
from emp e, (select empno r from emp where mgr=7839) rr
where  e.empno=rr.r(+)
--and level<=1
--and level<=0
start with r is not null --(7839)
connect by NOCYCLE e.mgr = prior e.empno
and level<=1
and level<=0
and 1=0
order siblings by ename


stax..и что мы видим траса не измениласьПуть от корня к узлу и не должен был меняться.
stax..Кстати надо проверить обходит ли with вглубьА вот здесь я ожидал, что при указании breadth first/depth first меняется алгоритм обхода, но по факту меняется только порядок выдачи, а обход всегда в ширину.

Итак, есть дерево с двумя ветками. В первой узел с именем ABC ближе к концу, а во-второй ближе к корню.
Задача найти ближайший узел с именем ABC.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
create or replace function stax_foto(p_name in varchar2) return number is
begin
  if p_name = 'ABC' then
    dbms_application_info.set_client_info('1');
  end if;
  return 0;
end;



Во втором случае я ожидал, что первая ветка будет обойдена до ABC, но ее обход остановился из-за того что ABC было встречено во второй ветке.
нежданчик
Код: plsql
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
SQL> exec dbms_application_info.set_client_info('');

PL/SQL procedure successfully completed.

SQL> with tmp_tree(id, id_parent, name) as
  2  (
  3  select 1e4 + 1, 0, 'first child' from dual
  4  union all
  5  select 1, 0, 'also first child' from dual
  6  union all
  7  select rownum + 1, rownum, decode(rownum, 1e4 - 3, 'ABC', '*****') from dual connect by level < 1e4
  8  union all
  9  select 1e4 + rownum + 1, 1e4 + rownum, decode(rownum, 3, 'ABC', '*****') from dual connect by level < 1e4
 10  ),
 11  rec(lvl, id) as
 12  (
 13  select 1 + stax_foto(name), id
 14    from tmp_tree where id_parent = 0
 15  union all
 16  select r.lvl + 1 + stax_foto(name), t.id
 17    from tmp_tree t
 18    join rec r on t.id_parent = r.id
 19    join v$session v on sid = userenv('sid') and client_info is null
 20  )
 21  search breadth first by id set ord
 22  --search depth first by id set ord
 23  select *
 24  from rec;

       LVL         ID        ORD
---------- ---------- ----------
         1          1          1
         1      10001          2
         2          2          3
         2      10002          4
         3          3          5
         3      10003          6
         4          4          7
         4      10004          8

8 rows selected.

SQL> exec dbms_application_info.set_client_info('');

PL/SQL procedure successfully completed.

SQL> with tmp_tree(id, id_parent, name) as
  2  (
  3  select 1e4 + 1, 0, 'first child' from dual
  4  union all
  5  select 1, 0, 'also first child' from dual
  6  union all
  7  select rownum + 1, rownum, decode(rownum, 1e4 - 3, 'ABC', '*****') from dual connect by level < 1e4
  8  union all
  9  select 1e4 + rownum + 1, 1e4 + rownum, decode(rownum, 3, 'ABC', '*****') from dual connect by level < 1e4
 10  ),
 11  rec(lvl, id) as
 12  (
 13  select 1 + stax_foto(name), id
 14    from tmp_tree where id_parent = 0
 15  union all
 16  select r.lvl + 1 + stax_foto(name), t.id
 17    from tmp_tree t
 18    join rec r on t.id_parent = r.id
 19    join v$session v on sid = userenv('sid') and client_info is null
 20  )
 21  --search breadth first by id set ord
 22  search depth first by id set ord
 23  select *
 24  from rec;

       LVL         ID        ORD
---------- ---------- ----------
         1          1          1
         2          2          2
         3          3          3
         4          4          4
         1      10001          5
         2      10002          6
         3      10003          7
         4      10004          8

8 rows selected.


То есть фраза
https://docs.oracle.com/cd/E11882_01/server.112/e41084/queries003.htm subquery_factoring_clause, which supports recursive subquery factoring (recursive WITH) and lets you query hierarchical data.
This feature is more powerful than CONNECT BY in that it provides depth-first search and breadth-first search Не очень правдива. Алгоритм обхода всегда в ширину. Меняется только порядок выдачи результата.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431383
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
row_number()Maxim Demenko default windowing clause -
Код: plaintext
order by ... range between unbounded preceding and current row
не для всегда.Все верно, range. Для row_number вообще нельзя указывать windowing_clause.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39431394
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..стр 75
Всегда имеет смысл указывать сортировку в левой части правил содержащих диапазоны ячеек, поскольку
- в таком случае улучшается производительность

почему улучшается?Потому что Ораклу не надо применять никакие механизмы для определения зависимостей между правилами.
Зависимости могут быть как между строками так и между столбцами.

По умолчанию Ораклу не надо анализировать зависимости между столбцами, т.к. применяется sequential order.
Если применяется automatic order, то Оракл анализирует зависимости между столбцами (при наличии правил, где одна мера вычисляется на основании другой)

Чтоб зависимости в рамках строк тоже были очевидны - имеет смысл указывать order by.
При отсутствии order by Ораклу надо анализировать зависимости между строками (при наличии правил, где текущее значение меры вычисляется на основании значений для других строк)

Как пример - рекурсия, зависящая от предыдущей строки
Код: plsql
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
SQL> alter session set workarea_size_policy = manual;

Session altered.

Elapsed: 00:00:00.01
SQL> alter session set sort_area_size = 2147483647;

Session altered.

Elapsed: 00:00:00.00
SQL> set timing on
SQL> with t as
  2  (select rownum id from dual connect by rownum <= 1e6)
  3  select sum(result) s, count(distinct result) cnt
  4  from
  5  (
  6  select *
  7  from t
  8  model
  9    ignore nav
 10    dimension by (id)
 11    measures (id x, id result)
 12    (result[any] order by id = sqrt(x[cv(id)-1] + result[cv(id)-1]))
 13  );

         S        CNT
---------- ----------
 667166412    1000000

Elapsed: 00:00:06.99
SQL> with t as
  2  (select rownum id from dual connect by rownum <= 1e6)
  3  select sum(result) s, count(distinct result) cnt
  4  from
  5  (
  6  select *
  7  from t
  8  model
  9    ignore nav
 10    dimension by (id)
 11    measures (id x, id result)
 12    (result[any] /*order by id*/ = sqrt(x[cv(id)-1] + result[cv(id)-1]))
 13  );

         S        CNT
---------- ----------
 667166412    1000000

Elapsed: 00:00:10.12

Я вроде про вертикальные/горизонтальные зависимости довольно много говорил когда писал про цикличность моделей.
stax..стр 93
какую задачу решает пример (хотел проверить на 94стр ) Нумерует птичек (\/) у которых одно из крыльев может отсутствовать. :)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39432178
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopstax..стартовый вернул три строки
добавляю (раскоментирую) level<=0Давай вернемся к тому, что написал я
Еще одним важным моментом является то, что проверка условия connect by выполняется
после возврата строк на текущем уровне. То есть если в условие соединения добавить level <= 1 и
level <= 0, то в любом случае будут возвращены все строки первого уровня. Строки первого уровня
должны удовлетворять условиям start with и where если таковые имеются. условие соединения - предикат в connect by
условие фильтрации - предикат в where
Выполни это
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select empno,LPAD (' ', LEVEL * 2, ' ')||ename tree,mgr,level,ename
from emp e, (select empno r from emp where mgr=7839) rr
where  e.empno=rr.r(+)
--and level<=1
--and level<=0
start with r is not null --(7839)
connect by NOCYCLE e.mgr = prior e.empno
and level<=1
and level<=0
and 1=0
order siblings by ename




понял, правильное поведение
отработал start with
дальше по условию нет родителей, остаются только корни

я под "условие соединения" понимал условия join

тоесть у меня в иерархическом как минимум 4 типа условий
в моей трактовке
1) уловие соединения e.empno=rr.r(+)
2) условие определения корня r is not null
3) условие построения иерархии (поиска детей) e.mgr = prior e.empno
4) условия фильтрации (and level<=1 and level<=0 закоментированы)


dbms_photoshopstax..стр 75
Всегда имеет смысл указывать сортировку в левой части правил содержащих диапазоны ячеек, поскольку
- в таком случае улучшается производительность

почему улучшается?Потому что Ораклу не надо применять никакие механизмы для определения зависимостей между правилами.
Зависимости могут быть как между строками так и между столбцами.

По умолчанию Ораклу не надо анализировать зависимости между столбцами, т.к. применяется sequential order.
Если применяется automatic order, то Оракл анализирует зависимости между столбцами (при наличии правил, где одна мера вычисляется на основании другой)

Чтоб зависимости в рамках строк тоже были очевидны - имеет смысл указывать order by.
При отсутствии order by Ораклу надо анализировать зависимости между строками (при наличии правил, где текущее значение меры вычисляется на основании значений для других строк)

Как пример - рекурсия, зависящая от предыдущей строки
Код: plsql
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.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
SQL> alter session set workarea_size_policy = manual;

Session altered.

Elapsed: 00:00:00.01
SQL> alter session set sort_area_size = 2147483647;

Session altered.

Elapsed: 00:00:00.00
SQL> set timing on
SQL> with t as
  2  (select rownum id from dual connect by rownum <= 1e6)
  3  select sum(result) s, count(distinct result) cnt
  4  from
  5  (
  6  select *
  7  from t
  8  model
  9    ignore nav
 10    dimension by (id)
 11    measures (id x, id result)
 12    (result[any] order by id = sqrt(x[cv(id)-1] + result[cv(id)-1]))
 13  );

         S        CNT
---------- ----------
 667166412    1000000

Elapsed: 00:00:06.99
SQL> with t as
  2  (select rownum id from dual connect by rownum <= 1e6)
  3  select sum(result) s, count(distinct result) cnt
  4  from
  5  (
  6  select *
  7  from t
  8  model
  9    ignore nav
 10    dimension by (id)
 11    measures (id x, id result)
 12    (result[any] /*order by id*/ = sqrt(x[cv(id)-1] + result[cv(id)-1]))
 13  );

         S        CNT
---------- ----------
 667166412    1000000

Elapsed: 00:00:10.12




сортировка не обязательно уникальная, и всеравно надо что-то там анализировать
мож просто меньше вариантов
вопрос для меня спорный, но почему-то работает
пример спицифический, сортировка по id и правило с ид cv(id)-1

поверю на слово (кстати, в статье в примерах сортировка не всегда прописана)

dbms_photoshop
То есть фраза
https://docs.oracle.com/cd/E11882_01/server.112/e41084/queries003.htm subquery_factoring_clause, which supports recursive subquery factoring (recursive WITH) and lets you query hierarchical data.
This feature is more powerful than CONNECT BY in that it provides depth-first search and breadth-first search Не очень правдива. Алгоритм обхода всегда в ширину. Меняется только порядок выдачи результата.

и не менняется присвоение rownum, в отличие от connect by


dbms_photoshop
Я вроде про вертикальные/горизонтальные зависимости довольно много говорил когда писал про цикличность моделей.
stax..стр 93
какую задачу решает пример (хотел проверить на 94стр ) Нумерует птичек (\/) у которых одно из крыльев может отсутствовать. :)
на 94стр, пример о банкомате
что делают правила понятно, не понятно какую жизненную задачу решает
не надо обяснять, никому кроме меня не интересно

СПАСИБ!!!

......
stax
...
Рейтинг: 0 / 0
25 сообщений из 108, страница 2 из 5
Форумы / Oracle [игнор отключен] [закрыт для гостей] / The Power of Oracle SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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