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

После мучительных размышлений на каком языке писать я таки решил сначала изложить на русском, но содержание осталось на английском.
Содержание
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Foreword
Part I
1. Joins
2. Query transformations
3. Analytic Functions
4. Aggregate functions
5. Hierarchical queries: connect by
6. Recursive subquery factoring
7. Model
8. Row Pattern Matching: match_recognize
9. Logical execution order of query clauses
10. Turing completeness
11. Summary
Part II
1. Solving SQL quizzes
2. When PL/SQL is better than basic SQL
Links

По некоторым конструкциям (model, recursive subquery factoring) в рунете доступно описание только базовых вещей, а по pattern matching вообще практически никаких материалов нет.

Цель была максимально всесторонне описать возможности оракловой реализации конструкции SELECT, при этом стремясь к простоте насколько это возможно и минимизации лишних деталей.
Под лишними деталями понимается
* внутренности оракла от защелок до принципа работы буфферного кеша
* оптимизация работы операций плана, например, nested loops batching
* различные баги и кривизна текущей реализации, от wrong results и ORA-03113 до возникновения чтений блоков в режиме currect при большом числе проходов в recursive subquery factoing
* прочие моменты, при углублении в которые, объем заметно бы вырос, например, особенности производительности сортировки при использовании аналитических функций
* какие-то недоработки SQL парсера: возможность менять местами anchor and recursive members для recursive subquery factoring, возможность перечислять несколько connect by подряд, из которых все, кроме последнего будут проигнорированы итд
* все остальное, что не меняет сути
По простому говоря фокус был на имеющейся мощи для получения данных.

Комментарии и корректировки приветствуются.
Огромная благодарность RA\/EN, andrey_anonymous, andreymx за их отзывы и замечания.

PS. Книга из двух частей. Вторую часть планирую закончить позже в феврале.
tagsnative syntax traditional oracle outer joins syntax ansi
left right full cross inner
equi theta natural semi anti

start with connect by prior nocycle level
connect_by_iscycle sys_connect_by_path connect_by_root connect_by_isleaf

search depth breadth first by set

model dimension measures rules
return updated rows return all rows
currentv cv
update upsert all upsert
sequential order automatic order
iteration_number previous reference
unique dimension unique single reference
presentv presentnnv
ignore nav keep nav

match_recognize pattern define
all rows per match
one row per match
final running
match_number classifier
with unmatched rows
show empty matches
omit empty matches
after match skip


Ссылка:
The Power of Oracle SQL. All versions
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39395953
dbms_photoshop,

пошел читать...

З.Ы.
Как вторую часть допишешь - сообщить не забудь. Обязательно почитаю и её тоже. ;)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39395960
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,

Было бы интересно узнать твоем мнение, учитывая что ты как и я достаточно много времени посвятил MSSQL и есть с чем сравнивать.

Кстати, изначально планировал еще три главы
Сравнение возможностей SELECT для Oracle vs MSSQL. По причине наличия явного лидера и во избежания холивара отказался от затеи.

SQL для работы с графами. Это исключил, т.к. SQL это НЕ для работы с графами за исключением вырожденных случаев.
С другой стороны анализ процедурного и декларативного подходов потребовал бы много текст и кода.
А на самом деле есть Graph Databases. Желающим расширить кругозор - рекомендую Next Generation Databases - Guy Harrison .

Особенности DML в Oracle. Например, про update при наличии join или conventional vs direct path inserts и подобное.
Это всё есть в блогах известных товарищей и прочих местах и заниматься просто компиляцией несколько нудно.

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

Отдельное спасибо за model! Да и вообще за книгу в целом! Взял на вооружение :)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396223
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Спасибо!
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396228
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,
спасибо, читаемс) замечанию тут собирать будешь или лучше на почту?)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396277
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,
буду писать сразу как читаю. иначе забуду.
1. пронумеруй, пожалуйста примеры. на странице 8 сложновато читать что там первый третий что второй пятый.... номера примеров должны быть.
2. страница 9 запрос:
Код: plsql
1.
2.
3.
4.
select *
 from t1, t2
where t2.id(+) = t1.id
 and nvl2(t2.rowid(+), t1.id, null) = 0;

ничем не отличается от запроса
Код: plsql
1.
2.
3.
select *
 from t1, t2
where t2.id(+) = t1.id


поэтому тестовые данные для нормального осознания отличий должны быть хотя бы такие:
Код: plsql
1.
2.
3.
4.
select *
 from t3, t2
where t2.id(+) = t3.id
 and nvl2(t2.rowid(+), t3.id, null) = 0;
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396297
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintdbms_photoshop,
спасибо, читаемс) замечанию тут собирать будешь или лучше на почту?)Предпочтительнее одним письмом все и сразу в почту. Форма свободная.
Точно не стоит обращать внимание на грамматику и пунктуацию, хотя, уверен, ты бы этого и не делал.
Вторая часть, где будут конкретные примеры, больше предполагает обсуждение.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396304
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vint...Принято.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396306
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,
ок. тогда буду выписывать себе в отдельный документ потом пришлю) правда думаю до конца недели точно читать буду)) если честно немного тяжеловато написано. ну или мозги у меня немного в паутине)) заодно и уборку проведу))
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396312
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopВторая часть, где будут конкретные примеры задачиFixed.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396334
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintесли честно немного тяжеловато написаноПосле главы про джойны легче пойдет. Инфа 146%.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396341
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круто. Спасибо.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396347
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жалко, что не освещена тема adaptive query optimization.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396370
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя наверное это усложнит ей, хотя по ней запросы весьма существенно переписываются
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396387
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shtockжалко, что не освещена тема adaptive query optimization.Когда человек анализирует как лучше написать запрос он не очень то думает про adaptive query optimization, не так ли?
То есть, это, опять же, несколько выходит за концепцию книги.
Ну и, во-вторых, в англо-интернетах достаточно качественного материала.

Вот понимание про наличие трансформаций может значительно помогать при написании запросов.
Читая про них можно встретить.
В Oracle 12c для воспроизведения надо отключить адаптивные планы с помощью команды
«alter session set optimizer_adaptive_reporting_only = true;»То есть, я предпочитаю не усложнять без надобности. :)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396477
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Можно было бы указать какие версии подходят под твой мануал. Еще думаю, можно было бы включить рассмотрение TOP - N и "новых"
фич SQL типа OFFSET, FETCH FIRST WITH TIES, CROSS APPLY / OUTER APPLY и их применение)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396496
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ora601dbms_photoshop,

Можно было бы указать какие версии подходят под твой мануал. Еще думаю, можно было бы включить рассмотрение TOP - N и "новых"
фич SQL типа OFFSET, FETCH FIRST WITH TIES, CROSS APPLY / OUTER APPLY и их применение)Про версии сказано во вступлении.

Про CROSS APPLY / OUTER APPLY описано в главе про соединения.

Про новые фичи множество статей.
Хорошая подборка из 5-ти частей - в гугл "Ask Tom: On Oracle Database 12c, Part".

В целом, фичи, которые расширили возможности SQL, полагаю, упомянуты: усовершенствования для joins и pattern matching.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396507
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
распространяется бесплатно ?

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

а где тогда кнопка "поддержать автора" ?Всё бесплатно, без рекламы и смс.
Автор будет благодарен отзывам.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396539
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, на работе начал читать
Сразу -- не очень формализировано, что ли, разъяснена разница в post- и pre- предикатах в описании соединений
Что, когда, исключения... (одно описано достаточно интересно)

Ну и операция FILTER -- я ее так и не смог формализовать, что у Льюиса, вот думал хоть здесь, на понятном русском.
Похоже, она выполняет все, на что не нашлось других названий (проскочила фраза, типа "отборка по критерию из другого источника", но это как-то слишком общно, на мой взгляд
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396554
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Познавательно, спасибо. Буду ждать второй части.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396612
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровСразу -- не очень формализировано, что ли, разъяснена разница в post- и pre- предикатах в описании соединенийДопускаю, что не очень формализированно, но мне казалось достаточно конкретно и понятно.
Еще была мысль при введении специфических Оракловых терминов сделать сноски со ссылками на ноты для желающих полной формальности.
pre/post join predicates (Doc ID 14736.1)
transitive closure (Doc ID 68979.1)
Это добавлю.
Вячеслав ЛюбомудровНу и операция FILTERВот это зачетная тема, и если раскрывать, то надо выделять методы соединения в отдельную главу.
Я полагаю механика работы похожа на nested loops, то-есть для каждой строки выполняется грубо говоря look-up.
Но есть отличия
- nested loops связывает два набора, а фильтров (и соответственно выполнения связанного набора) может быть несколько, при этом один набор основной.
- в фильтре может быть скоррелирован более хитрый запрос (точнее это было актуально до появления lateral views), например, connect by.
Код: plsql
1.
2.
3.
4.
5.
with t as (select rownum x1, 5 - rownum x2 from dual connect by rownum <= 5)
select *
  from t
 where (select sum(rownum) from dual connect by rownum <= x2) <
       (select sum(rownum) from dual connect by rownum <= x1)

Возникает, при наличии подзапросов в where, которые не были трансформированы.
Ясно дело, до формализации тут еще далеко. :)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396626
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, наверное нет смысла уже это упоминать, но у transitive closure в 9 (10?) был очень нехороший эффект -- чрезмерное размножение предикатов и, как следствие, неправильная оценка кардинальности
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39396752
HelpMePls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Regular expression - было бы хорошо добавить. или не было заметок?
...
Рейтинг: 0 / 0
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
The Power of Oracle SQL
    #39433566
blackmac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, познавательный труд.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39433867
Mr_Muscle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
!Спасибо за труд!

Очень познавательно. Особенно понравилось то, что много примеров и легко их воспроизвести.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39433872
Mr_Muscle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На странице 23 получается небольшая неточность

Запрос заполняет табличку днями недели
Код: plsql
1.
2.
3.
4.
create table week(id, day) as
select rownum, to_char(trunc(sysdate, 'd') + level - 1, 'fmday')
 from dual
connect by rownum <= 7;



У меня, например, заполняется русскими названиями, из-за этого некорректно будет отрабатывать запрос где сравнение идет по дням недели (on w.day = p.day)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39434058
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr_Muscle,

Спасибо, учту.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39434752
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plusdbms_photoshopпропущено...
Я подразумевал внешние соединения, но из процитированного абзаца это совершенно непонятно. Надо переформулировать. Спасибо.
пропущено...
Посмотрю сохранившуюся документацию по ORACLE v5 в переводе РДТеХ..
Посмотрел.
Подтверждаю, что в ORACLE v5 использовали (+) для указания внешних соединений.
SQL*Plus. Руководство пользователя. Версия 2.0
Подготовлено к печати 24 марта 1991 г.

SQL*Plus User's Guide
Version 2.0
Part No. 3201-V2.0 July 1987

Внешние соединения (стр. 76)
Код: plsql
1.
2.
3.
4.
SQL> SELECT ОТДЕЛЫ.ОТДЕЛ, ИМЯОТДЕЛА, ДОЛЖНОСТЬ, ФАМИЛИЯ
  2  FROM ОТДЕЛЫ, СОТРУДНИКИ
  3  WHERE ОТДЕЛЫ.ОТДЕЛ = СОТРУДНИКИ.ОТДЕЛ (+)
  4  ORDER BY ОТДЕЛЫ.ОТДЕЛ 


Потом сделаю скан этой страницы и размещу здесь, чтобы осталась для истории... :-)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39434762
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
v5
Код: 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.
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.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
                  НПКО Мекомп при Минчермете
             SQL * Plus   СПРАВОЧНОЕ РУКОВОДСТВО.
                          Версия 2.0
           СИСТЕМА УПРАВЛЕНИЯ РЕЛЯЦИОННОЙ БАЗОЙ ДАННЫХ
                            ORACLE
c Copyright,1986,1987   Корпорация  Oracle Белмонт,
Калифорния,США.
Все права сохраняются.Отпечатано в США.
Номер части 3203.V2.0
Ревизия июля 1987г.
Автор :   Джонатан Сакс
Соавторы: Лэрри Баер,Дэрри Кэбсенел,Лэрри Стивенс

                                Авторские права.
Использование,копирование или изложение подчиняются  огра-
ничениям  указанным в вашем контракте с Корпорацией ORACLE.
Использование,копирование или изложение  со стороны прави-
тельства подчиняются ограничениям,установленным в  подраз-
деле (b)(3)(ii) пункта об авторских правах  по "Техническим
Данным"  и   "Программному  обеспечению"  в       документе
CFR 252.227-7013.
        Информация,содержащаяся в данном документе м.б.из-
менена без предупреждения.

ORACLE-зарегестрированная торговая марка Корпорации ORACLE.
SQL * Plus - торговая марка Корпорации ORACLE.

                            ИСТОРИЯ ИЗМЕНЕНИЯ.
Версия     Статус     История изменения        Дата

2.0        Beta       Редакция,приведшая      6/86
                      к версии 2.0 SQL*Plus
                      и 5.1 ORACLE.
             -        Добавлено описание
                      SQL*Net (сетевой
                      вариант)
             -        Справочное руководство
                      по SQL*Plus выделено из
                      руководства по пользо-
                      ванию и опубликовано
                      отдельно.
2.0        Продукция  Редакция с целью уточ-   10/10/86
                      нения и улучшения
                      восприятия текста.

                                ПРЕДИСЛОВИЕ.
                                   ЦЕЛЬ.
        Справочное руководство по SQL*Plus  содержит
              детальное описание языка запросов  SQL*Plus,
              который м.б.использован для создания,
              хранения,модификации,поиска,вывода на
              печать  и  управления  информацией  в БД ORACLE.

… … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … 

                            ДРУГИЕ ОПЕРАТОРЫ SQL

Оператор       Функция                   Пример

(+)            Указание того,что пре-  ...WHERE DEPT.
               дыдущий столбец являет-  DEPTNO=EMP.DEPTNO(+)
               ся внешним,объединяющим
               столбцом в соединении.

… … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … … 

                           Соединения в Запросах
SELECT ...FROM табл,табл,...
 WHERE условие...;
                        Связанная тема: SELECT.
        Описание: Когда строки выбираются из двух или более таблиц,
для их соединения  в  разных  таблицах может  использовать-
ся фраза WHERE.Любое логическое выражение  во фразе WHERE,
сравнивающее поля в различных таблицах,определяет  соедине-
ние ; соединяются строки,для которых выражение истинно.
        Оператор  '(+)' можно использовать с любой стороны логичес-
кого выражения для указания внешнего соединения,при котор-
ом каждая строка одной таблицы соединяется по  меньшей мере
с одной строкой другой  таблицы  (указанной с '(+)').Если
отсутствует строка для соединения,то,по правилам соедине-
ния ,определенным с помощью логического выражения ,строка
соединяется с мнимой строкой ,в  которой все поля содержат
пустые значения.
        Примеры: П р о с т о е с о е д и н е н и е: Чтобы  для каж-
дого служащего отобразить его имя,оклад(SAL),должность(JOB),
и название отдела(DNAME),где номер отдела не больше 30,
введите:

         SQL> SELECT     ENAME,SAL,JOB,DNAME
           2  FROM       EMP,DEPT
           3  WHERE      EMP,DEPTNO<=30 AND EMP.DEPTNO=
           4             DEPT.DEPTNO;

Так  как информация для отображения хранится в двух различ-
ных таблицах ,требуется соединение .Строки из двух таблиц
соединяются согласно правилу EMP.DEPTNO=DEPT.DEPTNO.
        Заметим ,что DEPTNO не  обязательно  д.б.выбран из
 таблицы .Кроме того фраза WHERE ( с логическим выражением
DEPTNO<=30 )  используется для выделения строк точно также,
как и для описания соединения.
        В н е ш н е е  с о е д и н е н и е: Чтобы  отобразить ту же
самую информацию,но обеспечить вывод  на экран каждой выб-
ранной из EMP строки,даже ,если  DEPT не содержит  строки
для  соответственного  номера  отдела ,нужно  использовать
оператор  внешнего  соединения  в  DEPT.DEPTNO.Тогда,если
строка из EMP не  соединится с  какой либо строкой из DEPT,
она будет сливаться с мнимой строкой из NULL-таблиц:

         SQL> SELECT     ENAME,SAL,JOB,DNAME
           2   FROM       EMP,DEPT
           3   WHERE      EMP,DEPTNO<=30 AND EMP.DEPTNO=
           4              DEPT.DEPTNO(+);


...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39434774
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicv5
Это ещё одно подтверждение про (+) в ORACLE v5.

Может быть у кого-то остались описания от ORACLE v4?

Советская версия называлась КАРС, КАРС-32
(Корневая Автоматизированная (?) Реляционная Система).
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39434789
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий Юринский,

Вот и верь после этого сотрудникам Оракла. :))
Хотя я помню, что не только у госпожи Колган встречал про шестую версию.
На сайте Оракла можно нагуглить такой антиквариат
http://www.oracle.com/technetwork/database/database-technologies/rdb/0307-sql1999-130211.pdf Basic joined tables: Inner joins, right and left outer joins, with full nesting with arbitrary
comparison operators.
Rdb has supported this feature since V6.0.
В других местах пишут, что old style синтаксис реализован по стандарту SQL-86.

В третьих местах пишут, что в SQL-86 ничего не было про внешность соединений и некоторые вендоры реализовывали по своему усмотрению.
http://in2test.lsi.uniovi.es/sqlfpc/?lang=en#sql86joins The SQL86 standard does not specify outer joins. However, there are some DBMS vendor specific ways to indicate outer joins which are now supported. Given a join condition in the WHERE over columns a and b of the joined tables, the following outer joins are supported:

Oracle: a = b (+) (left), a (+) = b (right)
SQL Server: a *= b (left), a =* b (right)Похоже на правду, в МССКЛ даже на последних версиях работает эта техника со звездочками.

А вообще насколько я понял 4-я версия была даже не клиент-серверной, так что в те дебри не особо интересно уже лезть.
Раньше у меня было несоклько pdf c историческими вехами, но некоторые все еще просто гуглятся на сайте Оракла.
http://www.oracle.com/us/corporate/profit/p27anniv-timeline-151918.pdf 1985 Oracle keeps
pace with emerging computing models
with the release of Oracle Version 5, one
of the first relational database systems
to operate in client/server environments.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39434800
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopВалерий Юринский,

А вообще насколько я понял 4-я версия была даже не клиент-серверной, так что в те дебри не особо интересно уже лезть.
Раньше у меня было несоклько pdf c историческими вехами, но некоторые все еще просто гуглятся на сайте Оракла.
[/quot]
В нашей книге "Oracle7: Практическое руководство" (М., Софтсервис, 1997)
я привел историческую информацию, почерпнутую из большого текста,
найденного в конференции Usenet. Это был перевод на русский язык.

P.S. Книжку уже отсканировали.
Жду, когда распознают в текст.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39438790
rekrabbe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Автор, а куда вы выкладываете новую версию книги, в первом сообщение есть ссылка на книгу, но там версия 1.0. или 1.0 пока и есть последняя?
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39438801
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rekrabbeпока и есть последняя?Да.

PS. К сожалению, движок wordpress не позволяет удалить файл и загрузить с тем же именем, так что новую ссылку выложу здесь позже.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39452211
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop, блин как-то пропустил тему. Сейчас в "курилке" увидел сообщение про книгу, почитаю на досуге. Спасибо за труд.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39466296
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работа завершена.

Получилось "немного" позже чем конец февраля, но вторая часть оказалась несколько насыщеннее, чем предполагалось. Итого опубликовано 15 задач, которые решаются разными специфическими фичами Oracle SQL. Все примеры из реальной жизни (ну ладно, кроме Zeckendorf representation и Quine :)), определенное влияние на контент, безусловно, оказано общением на sql.ru

Хотел бы выразить благодарность Elic, SY, -2-, wurdu, andrey_anonymous, RAVEN, Sayan Malakshinov, orawish, Vladimir Sitnikov, anrdeymx, Nikotin_, suPPLer, Vint, stax, всех сложно перечислить.
Sayan Malakshinov и orawish повлияли напрямую - во второй части от них использовано по одному PL/SQL алгоритму.

Некоторые задачи планировал опубликовать как пятничные, но в итоге таки воздержался.
Если кто придумает более элегантные/производительные решения - просьба продемонстрировать.
В summary ко второй части таблица со спискам задач и приемами, использованными в решении .
Для некоторых можно было включить дополнительные приемы, но поскольку они не вносили никакой новизны и не являются привлекательными с точки зрения производительности - этого сделано не было.

Вторая часть более практическая и меньше первой по объему, полагаю читать ее увлекательнее чем первую, хотя, местами, может быть и сложнее.
Критика и комментарии приветствуются.

Все версии книги.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39466297
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, пару человек после первой части мне говорили "не слишком ли ты восхваляешь pattern matching? неплохо бы больше фактов".
Надеюсь это требование удовлетворено.

Еще важный момент что все скрипты для исходных данных находятся непосредственно в книге и в тех случаях, когда использовано dbms_random.seed, стоит про него не забывать для воспроизводимости результатов.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39466385
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Thx
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39467063
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop Задача: для таблицы с числами получить сумму их всех возможных комбинаций
...
Если бы в таблице были только первые три строки, select * from t_num where id < =3;
ID NUM1 1 2 4 3 9
то были бы такие комбинации чисел
1 + 4 = 5
1 + 9 = 10
4 + 9 = 13
1 + 4 + 9 = 14
и итоговая сумма 5 + 10 + 13 + 14 = 42

Садись, два. Сами числа исходной таблицы есть комбинации.
Правильный ответ - 42 + 14 = 56

dbms_photoshop На SQL это решается, если сгенерировать все возможные перестановки (как минимум два способа с помощью connect by) и затем для перестановки посчитать сумму.
Вычисление суммы всех возможных комбинаций не требует "генерации" последовательностей .
Поэтому не требуется ни 25 секунд, ни 10-и, ни, даже, 0,5-и.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
With T as (
Select 1 as id, 1 as num from dual 
union all
Select 2 as id, 4 as num from dual 
union all
Select 3 as id, 9 as num from dual 

)
Select isum * ipt as true_result
     , isum * (ipt-1) as  dbms_photoshot_result
From (
Select  Sum(T.num) as isum ,  Floor(power(2,count(*))/2) as ipt from T
)



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

Замечательно, что ты получил "true_result", только это не то, что требовалось в задаче.
Перечитай что требуется еще раз. Если вопросы останутся - можно поговорить, если ты изменишь стиль.

В сгенерированных данных может быть какая-то магия (хотя я ее пока не вижу), но речь идет про общий случай.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39467086
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,
магия, вопросы...
Смешной ты.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39467087
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopВ сгенерированных данных может быть какая-то магия (хотя я ее пока не вижу), но речь идет про общий случай.Точнее, учитывая вполне фиксированную формулу для генерации можно вывести формулу для суммы всего, но это не то, что требуется.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39467089
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobydbms_photoshop,
магия, вопросы...
Смешной ты.Спасибо за твое замечание, booby. Хорошего дня.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39467642
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

a1+a2+a3 + (a1+a2+a3) + (a1+a2) + (a1+a3) + (a2+a3) =4(a1 + a2 + a3)

Ну и дальше школьная математика в аппроксимации на N элементов.

А вообще это действительно следствие из бинома Ньютона
Пример не самый удачный получился. Для таких задач полно уже выведенных формул в комбинаторике.

А вот для задачи с комбинациями строк таких формул сильно меньше.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39467683
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

Целью надо сделать получение таблицы с комбинациями, а не их суммы.
Это упрощение было лишним.

Там дальше еще встречается сравнение запросов с select sum(...) вместо select * для того, чтоб минимизировать фетч.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39468039
Фотография мегамозг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopКстати, изначально планировал еще три главы ...
Особенности DML в Oracle. Например, про update при наличии join ... и подобное.
Это всё есть в блогах известных товарищей и прочих местах и заниматься просто компиляцией несколько нудно.

А главное эти три темы выходят за рамки основной идеи книги.

Я вот не припомню, чтобы в книгах по оракл было про апдейт или дилит с джойнами. В отличие от книг по MySQL или MS SQL.
По-моему, это базовая вещь и обязательно должна присутствовать в любой книге по sql.
Странно это.
Или имелось в виду что-то отличное от
Код: sql
1.
2.
3.
4.
--ms sql 
update t set f1 = z.f2
from table1 t
join table2 z on t.k = z.k
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39468070
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мегамозг,

открой для себя merge
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39468076
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мегамозгЯ вот не припомню, чтобы в книгах по оракл было про апдейт или дилит с джойнами.RTFM Updating a Join View (FAQ)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39468079
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мегамозг,

Я думал об этом написать, но описание самого апдейта требует много деталей и, кроме того, тянет за собой обсуждение merge и сравнение с реализацией update хотя бы в MSSQL. Мне не встречалось всестороннее освещение вопроса, хотя по отдельным моментам неплохие статьи есть. Вообще я это уже упомянул 20168274 .
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39468080
Фотография мегамозг
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintмегамозг,

открой для себя merge
Ты имеешь в виду merge как update/insert по совпадению?
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39468086
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мегамозгdbms_photoshopКстати, изначально планировал еще три главы ...
Особенности DML в Oracle. Например, про update при наличии join ... и подобное.
Это всё есть в блогах известных товарищей и прочих местах и заниматься просто компиляцией несколько нудно.

А главное эти три темы выходят за рамки основной идеи книги.

Я вот не припомню, чтобы в книгах по оракл было про апдейт или дилит с джойнами. В отличие от книг по MySQL или MS SQL.
По-моему, это базовая вещь и обязательно должна присутствовать в любой книге по sql.
Странно это.
Или имелось в виду что-то отличное от
Код: sql
1.
2.
3.
4.
--ms sql 
update t set f1 = z.f2
from table1 t
join table2 z on t.k = z.k

Ну и лучше отсутствие update join для общего случая (хотя лучше бы был) чем молчаливая недетерминированность как в MSSQL.
update from + exception

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

открой для себя merge
Ты имеешь в виду merge как update/insert по совпадению? Почему бы тебе сначала не отправиться в поиск?
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39538288
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

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

Только на английском. Должно выйти в январе - феврале. Весной буду в Москве, презентую.

При переводе были некоторые исправления и дополнения к финальной русской версии, но я её править больше не планирую.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39538393
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopПри переводе были некоторые исправления и дополнения к финальной русской версии, но я её править больше не планирую.
Ну вот как всегда - "вычищенное" на аглицком :)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39540627
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Откуда можно скачать вторую часть книги?
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39540636
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamir,

Просил несколько раз модераторов добавить в конец стартового поста, но меня игнорят.

The Power of Oracle SQL. All versions

Модератор: добавлено в стартовый ПОСТ
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39540640
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

эту ссылку я видел. Но при переходе: "Not published yet"((
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39540645
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
israelshamir,

Version 1.1 содержит обе части.

Not published yet относится к инглиш версии.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39540816
israelshamir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

протормозил я что - то, извиняюсь. Книга замечательная, спасибо!
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39594543
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envПечатное издание книги планируется или я всё пропустил?Ровно через год после начала топика. :)
Тынц (публично еще недоступно)

Если кого из Москвы интересует - вероятно буду там в апреле, могу за полцены бокал пива передать.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39594681
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЕсли кого из Москвы интересует
+1 к nvl(кого из Москвы интересует,0)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39594712
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dbms_photoshop,

Поздравляю! Большое хорошее дело
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39594806
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,
Ждем тебя в апреле чтобы обмыть)) предупреди за пару недель чтобы собрать побольше народу)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39594853
гр к
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop, в описании релиза указано 240 страниц, а в файле пдф 182 страницы.
В чём причина?
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39594898
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гр кdbms_photoshop, в описании релиза указано 240 страниц, а в файле пдф 182 страницы.
В чём причина?Помимо того, что в книге может присутствовать дополнительный материал, средний размер страницы книги меньше А4. Насколько я помню, PDF у фотошопа - это не отсканированные страницы, а оцифрованный материал.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39594992
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гр к,

Я доработал до 200-210 страниц, остальное это результат форматирования издательства.
Кардинально переработана и дополнена только глава 9 "Logical execution order of query clauses".
Там, скажем так, был ряд misleading statements.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39594998
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за отзывы, критику и комментарии.
Без этого форума книги, наверное, не было бы.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595001
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopСпасибо за отзывы, критику и комментарии.
Без этого форума книги, наверное, не было бы.Была бы!
Но, возможно, несколько другая... :-)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595079
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://www.apress.com/gb/book/9781484233719 Authors: Reprint sev, AlexФамилия автора интересно выглядит в английском написании... :-)

https://ru.wikipedia.org/wiki/Репринт Репри́нт (англ. to reprint — перепечатывать, переиздавать) — издание, выпуск которого
осуществляется путём репродуцирования (сканирования) страниц книги, рукописи и прочих
выбранных для воспроизведения источников с сохранением текста, но без воспроизведения
особенностей материалов (бумаги, переплёта) и печати (дефектов, исправлений, опечаток)
предыдущего издания. Последним свойством отличается от факсимиле.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595099
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий Юринский,

Давайте будем фокусироваться на контенте, а не личностях.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595208
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopВалерий Юринский,

Давайте будем фокусироваться на контенте, а не личностях.Это не "фокусировка", а лишь забавное наблюдение... :-)

P.S. Вместо "контент" я бы предпочёл использовать "содержание"
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595224
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий ЮринскийP.S. Вместо "контент" я бы предпочёл использовать "содержание"Вот я как раз имел в виду "содержимое", а не "содержание".
Еще можно было сказать информационное наполнение , но громоздко и нелепо.

Я, конечно, положительно отношусь к мессаджу посылу из статьи Жобоффер из дефекат-рум ,
и тоже за чистоту языка, но определенные тенденции имеются и время определит что переводить не стоит, а лучше позаимствовать.

Например, вместо попыток перевести immutable, persistent, multitenant и проч. я лучше использую слово оригинала общаясь в интернетах.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595246
dbms_photoshopя лучше использую слово оригинала общаясь в интернетах.
Раскладку переключать лениво, а транскрипция... неее, лучше уж локализованный термин :)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595249
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Возьму в изучение.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595259
слово оригиналалокализованный терминЕсть немало старых терминов, которым до сих пор нет устоявшегося перевода из-за неоднозначности вариантов. Взять ЯСЗ, который пытались писать по началу в книгах. Много ли молодняка поймет, что это?
Да и потом, в русском языке уже 70% терминов заимствованы. Как по-исконнорусски таблица или индекс??
Или. Решил ты переводить column не как давно заимствованное колонка, а более русское поле. И тут бац - hybrid columnar compression - гибридное пополевое сжатие. Очень по-русский звучит "пополевое", а "полевое" не полностью отражает смысл термина.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595282
partiition-section, drop-deleteЯСЗЭто Ярославский Судостроительный Завод.
А вот СЯЗ уже обсуждали .
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595431
ы!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ы!
Гость
Валерий Юринский https://www.apress.com/gb/book/9781484233719 Authors: Reprint sev, AlexФамилия автора интересно выглядит в английском написании... :-)

https://ru.wikipedia.org/wiki/Репринт Репри́нт (англ. to reprint — перепечатывать, переиздавать) — издание, выпуск которого
осуществляется путём репродуцирования (сканирования) страниц книги, рукописи и прочих
выбранных для воспроизведения источников с сохранением текста, но без воспроизведения
особенностей материалов (бумаги, переплёта) и печати (дефектов, исправлений, опечаток)
предыдущего издания. Последним свойством отличается от факсимиле.

Вот про фамилии в английском написании я бы на вашем месте вообще не заикался...
Учитывая что правильная транслитерация буквы "Ю" - это "IU"

Пользуясь случаем, автору топика - спасибо!
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39595492
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopВалерий ЮринскийP.S. Вместо "контент" я бы предпочёл использовать "содержание"Вот я как раз имел в виду "содержимое", а не "содержание".
Это синонимы, но в данном случае "содержание" по смыслу ближе... :-)
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39596691
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop, спасибо за труд!
на 9 странице опечатка, первое предложение последнего абзаца, вероятно, пропущено слово "когда"
The Power of Oracle SQLКонцепция pre/post join предикатов применима только тогда имеется внешнее
соединение.
...
Рейтинг: 0 / 0
The Power of Oracle SQL
    #39596956
Страница 72 - опечатка
авторВ обоих случаях мы имеем одинаковое число строк в результате, хотя при обходе в
глубину ожидалось получить вес строки первой ветки, ведь ни одно из ее значений не равно 101.
...
Рейтинг: 0 / 0
108 сообщений из 108, показаны все 5 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / The Power of Oracle SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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