Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
 The Power of Oracle SQL  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
За годы работы с Ораклом у меня накопилось множество заметок, ссылок и прочих материалов, информацию из которых я оформил в виде книги.
The Power of Oracle SQL

После мучительных размышлений на каком языке писать я таки решил сначала изложить на русском, но содержание осталось на английском.
Содержание
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. Книга из двух частей. Вторую часть планирую закончить позже в феврале.
+ tags
native 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

Сообщение было отредактировано: 23 окт 17, 18:29
1 фев 17, 05:45    [20168262]     Ответить | Цитировать Сообщить модератору
 Re: The Power of Oracle SQL  [new]
Добрый Э - Эх
Guest
dbms_photoshop,

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

З.Ы.
Как вторую часть допишешь - сообщить не забудь. Обязательно почитаю и её тоже. ;)
1 фев 17, 05:50    [20168263]     Ответить | Цитировать Сообщить модератору
 Re: The Power of Oracle SQL  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Добрый Э - Эх,

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

Кстати, изначально планировал еще три главы
  • Сравнение возможностей SELECT для Oracle vs MSSQL. По причине наличия явного лидера и во избежания холивара отказался от затеи.
  • SQL для работы с графами. Это исключил, т.к. SQL это НЕ для работы с графами за исключением вырожденных случаев.
    С другой стороны анализ процедурного и декларативного подходов потребовал бы много текст и кода.
    А на самом деле есть Graph Databases. Желающим расширить кругозор - рекомендую Next Generation Databases - Guy Harrison.
  • Особенности DML в Oracle. Например, про update при наличии join или conventional vs direct path inserts и подобное.
    Это всё есть в блогах известных товарищей и прочих местах и заниматься просто компиляцией несколько нудно.

    А главное эти три темы выходят за рамки основной идеи книги.
  • 1 фев 17, 06:12    [20168274]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Kido
    Member

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

    Отдельное спасибо за model! Да и вообще за книгу в целом! Взял на вооружение :)
    1 фев 17, 11:15    [20168825]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    123йй
    Member

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

    Спасибо!
    1 фев 17, 12:24    [20169057]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Vint
    Member

    Откуда: Москва
    Сообщений: 4564
    dbms_photoshop,
    спасибо, читаемс) замечанию тут собирать будешь или лучше на почту?)
    1 фев 17, 12:28    [20169074]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Vint
    Member

    Откуда: Москва
    Сообщений: 4564
    dbms_photoshop,
    буду писать сразу как читаю. иначе забуду.
    1. пронумеруй, пожалуйста примеры. на странице 8 сложновато читать что там первый третий что второй пятый.... номера примеров должны быть.
    2. страница 9 запрос:
    select *
     from t1, t2
    where t2.id(+) = t1.id
     and nvl2(t2.rowid(+), t1.id, null) = 0;
    
    ничем не отличается от запроса
    select *
     from t1, t2
    where t2.id(+) = t1.id
    

    поэтому тестовые данные для нормального осознания отличий должны быть хотя бы такие:
    select *
     from t3, t2
    where t2.id(+) = t3.id
     and nvl2(t2.rowid(+), t3.id, null) = 0;
    
    1 фев 17, 13:05    [20169294]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Vint
    dbms_photoshop,
    спасибо, читаемс) замечанию тут собирать будешь или лучше на почту?)
    Предпочтительнее одним письмом все и сразу в почту. Форма свободная.
    Точно не стоит обращать внимание на грамматику и пунктуацию, хотя, уверен, ты бы этого и не делал.
    Вторая часть, где будут конкретные примеры, больше предполагает обсуждение.
    1 фев 17, 13:16    [20169358]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Vint
    ...
    Принято.
    1 фев 17, 13:20    [20169380]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Vint
    Member

    Откуда: Москва
    Сообщений: 4564
    dbms_photoshop,
    ок. тогда буду выписывать себе в отдельный документ потом пришлю) правда думаю до конца недели точно читать буду)) если честно немного тяжеловато написано. ну или мозги у меня немного в паутине)) заодно и уборку проведу))
    1 фев 17, 13:20    [20169383]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    dbms_photoshop
    Вторая часть, где будут конкретные примеры задачи
    Fixed.
    1 фев 17, 13:26    [20169411]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Vint
    если честно немного тяжеловато написано
    После главы про джойны легче пойдет. Инфа 146%.
    1 фев 17, 13:51    [20169558]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Shtock
    Member

    Откуда: СПб
    Сообщений: 3049
    Круто. Спасибо.
    1 фев 17, 14:05    [20169617]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Shtock
    Member

    Откуда: СПб
    Сообщений: 3049
    жалко, что не освещена тема adaptive query optimization.
    1 фев 17, 14:10    [20169642]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Shtock
    Member

    Откуда: СПб
    Сообщений: 3049
    хотя наверное это усложнит ей, хотя по ней запросы весьма существенно переписываются
    1 фев 17, 14:29    [20169739]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Shtock
    жалко, что не освещена тема adaptive query optimization.
    Когда человек анализирует как лучше написать запрос он не очень то думает про adaptive query optimization, не так ли?
    То есть, это, опять же, несколько выходит за концепцию книги.
    Ну и, во-вторых, в англо-интернетах достаточно качественного материала.

    Вот понимание про наличие трансформаций может значительно помогать при написании запросов.
    Читая про них можно встретить.
    В Oracle 12c для воспроизведения надо отключить адаптивные планы с помощью команды
    «alter session set optimizer_adaptive_reporting_only = true;»
    То есть, я предпочитаю не усложнять без надобности. :)
    1 фев 17, 14:45    [20169800]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    ora601
    Member

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

    Можно было бы указать какие версии подходят под твой мануал. Еще думаю, можно было бы включить рассмотрение TOP - N и "новых"
    фич SQL типа OFFSET, FETCH FIRST WITH TIES, CROSS APPLY / OUTER APPLY и их применение)
    1 фев 17, 16:08    [20170200]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    ora601
    dbms_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.
    1 фев 17, 16:24    [20170329]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    grok
    Member

    Откуда:
    Сообщений: 1686
    распространяется бесплатно ?

    а где тогда кнопка "поддержать автора" ?
    1 фев 17, 16:32    [20170376]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    grok
    распространяется бесплатно ?

    а где тогда кнопка "поддержать автора" ?
    Всё бесплатно, без рекламы и смс.
    Автор будет благодарен отзывам.
    1 фев 17, 16:43    [20170421]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Вячеслав Любомудров
    Member

    Откуда: Владивосток
    Сообщений: 18486
    Спасибо, на работе начал читать
    Сразу -- не очень формализировано, что ли, разъяснена разница в post- и pre- предикатах в описании соединений
    Что, когда, исключения... (одно описано достаточно интересно)

    Ну и операция FILTER -- я ее так и не смог формализовать, что у Льюиса, вот думал хоть здесь, на понятном русском.
    Похоже, она выполняет все, на что не нашлось других названий (проскочила фраза, типа "отборка по критерию из другого источника", но это как-то слишком общно, на мой взгляд
    1 фев 17, 16:53    [20170479]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    env
    Member

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

    Познавательно, спасибо. Буду ждать второй части.
    1 фев 17, 17:03    [20170520]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Вячеслав Любомудров
    Сразу -- не очень формализировано, что ли, разъяснена разница в 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.
    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, которые не были трансформированы.
    Ясно дело, до формализации тут еще далеко. :)
    1 фев 17, 18:11    [20170775]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Вячеслав Любомудров
    Member

    Откуда: Владивосток
    Сообщений: 18486
    Кстати, наверное нет смысла уже это упоминать, но у transitive closure в 9 (10?) был очень нехороший эффект -- чрезмерное размножение предикатов и, как следствие, неправильная оценка кардинальности
    1 фев 17, 18:17    [20170800]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    HelpMePls
    Member

    Откуда:
    Сообщений: 345
    Regular expression - было бы хорошо добавить. или не было заметок?
    1 фев 17, 20:45    [20171172]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    HelpMePls
    Regular expression - было бы хорошо добавить. или не было заметок?
    Так регулярки - это не SQL, получается отклонение от темы.

    Материалов масса, вплоть до оракловых White Paper - Introducing Oracle Regular Expressions.
    Интереснее было бы написать сравнение оракловой реализации скажем, с perl, чтоб показать ограниченность первой.
    Для этого легко можно подобрать с десяток реальных задач даже только с этого форума.
    Я как-то публиковал краткий обзор Evolution of regular expressions. Дальше развивать тему не особо интересно.
    1 фев 17, 21:12    [20171209]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    pihel
    Member

    Откуда: СПБ
    Сообщений: 160
    dbms_photoshop,

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

    может first_value(value) over() ?
    6 фев 17, 09:54    [20182914]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    moishamiem
    Member

    Откуда: ЧФ
    Сообщений: 164
    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: не знакомому понятно сложно, а знакомый не найдет много нового и полезного.

    В общем, хочется больше поясняющего текста, более плавный переход от простого к сложному.
    6 фев 17, 10:45    [20183163]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

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

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

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

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

    moishamiem
    3) Почему мне так кажется? Потому что к главе про 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. Это не выход. Чтение подразумевает пользование гуглом при необходимости.
    Ну и я отдаю себе отчет, что в повествовании делается достаточно быстрое погружение в тонкости, так что у меня нет иллюзий что книга будет интересна не разработчикам БД. Даже толковый джавист или сишарпник быстро отложит в сторону с вердиктом "ничего нипанятна".
    6 фев 17, 13:51    [20184503]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    moishamiem,

    Ну и спасибо за отзыв. Без обид. Я понимаю, что всем всё равно не угодишь.
    6 фев 17, 13:53    [20184516]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    pihel
    dbms_photoshop,

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

    может first_value(value) over() ?
    Да, спасибо, надо поправить.
    либо
    first_value(value) over (order by id)
    либо
    min(value) keep (dense_rank first order by id) over ()
    да хоть nth_value. :)
    6 фев 17, 14:01    [20184568]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    moishamiem
    Member

    Откуда: ЧФ
    Сообщений: 164
    dbms_photoshop,

    Да, конечно, без обид. Автору виднее как и для кого писать.
    6 фев 17, 14:35    [20184763]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    оси лил целиком
    Guest
    фотошоп нагенерировал фибоначчи через connect by, а столько воплей раньше было, что это невозможно))

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

    когда вторая часть?
    24 мар 17, 22:02    [20331176]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    SQL*Plus
    Member

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

    Стр. 7
    До версии 9i в Oracle не было поддержки ANSI соединений, поэтому для соединения
    таблиц, их имена необходимо было перечислить во from и указать условия соединения в where.
    Oracle-specific syntax для соединений был впервые реализован в версии Oracle 6.

    В ORACLE v5 и v4 был такой синтаксис.
    Предполагаю, что он же был и раньше.
    26 мар 17, 21:24    [20334559]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    оси лил целиком
    когда вторая часть?
    По не зависящим от меня обстоятельствам несколько изменились приоритеты. Но работа потихоньку идет. Осталась одна глава и итоговая версия ожидается до конца апреля.
    SQL*Plus
    dbms_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.
    26 мар 17, 23:20    [20334965]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    israelshamir
    Member

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

    Спасибо за книгу!=)
    27 мар 17, 08:40    [20335486]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    SQL*Plus
    Member

    Откуда: Россия, Москва
    Сообщений: 8131
    dbms_photoshop
    оси лил целиком
    когда вторая часть?
    По не зависящим от меня обстоятельствам несколько изменились приоритеты. Но работа потихоньку идет. Осталась одна глава и итоговая версия ожидается до конца апреля.
    SQL*Plus
    dbms_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 в переводе РДТеХ..
    27 мар 17, 23:42    [20338976]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    stax..
    Guest
    dbms_photoshop,

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

    осилил

    не знал о dbms_sql2.expand_sql_text


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


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

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

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

      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,
    то в любом случае будут возвращены все строки первого уровня.


      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
    31 мар 17, 17:11    [20355444]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    условие совокупления
    Guest
    stax..
    стр 56
    То есть если в условие соединения добавить level <= 1 и level <= 0,
    то в любом случае будут возвращены все строки первого уровня.


      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
    
    31 мар 17, 17:54    [20355627]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    stax..
    Guest
    условие совокупления
    stax..
    стр 56
    То есть если в условие соединения добавить level <= 1 и level <= 0,
    то в любом случае будут возвращены все строки первого уровня.


      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
    

    не понял, какого (чего) соеденения?
      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
    31 мар 17, 18:41    [20355765]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    stax..
    не понял фразы
    стр 41
    Если <order by> указано, то окно определяется от первой строки секции
    и до текущей


    если не указано другое
    Имелось в виду, что
    order by ...
    эквивалентно
    order by ... rows between unbounded preceding and current row
    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;
    

            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стр )
    На эти два момента позже отвечу. Пора бежать.

    Спасибо за отзыв.
    31 мар 17, 20:11    [20355926]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    stax..
    Guest
    dbms_photoshop,

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

    наоборот, где сказано что левел 1 не сортируется

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

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

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

    стартовый возвращает
    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
    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
    

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

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


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

    вширь connect by
      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
    31 мар 17, 20:43    [20355981]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    stax..
    Guest
    stax..

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

    ......
    stax

    создаем ф-цію, будет запомінать последовательнось вызовов
    в формате <id/level.rownum)
    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 в ширину
    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

    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> и тд

    пример в глубь
    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
    31 мар 17, 22:10    [20356142]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Maxim Demenko
    Member

    Откуда: Munich, Germany
    Сообщений: 940
    dbms_photoshop
    stax..
    не понял фразы
    стр 41
    Если <order by> указано, то окно определяется от первой строки секции
    и до текущей


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

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

    Regards

    Maxim
    31 мар 17, 23:47    [20356301]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    stax..
    Guest
    Maxim Demenko,
    очепятался rows - range

    .....
    stax
    1 апр 17, 01:43    [20356385]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    row_number()
    Guest
    Maxim Demenko
    default windowing clause -
    order by ... range between unbounded preceding and current row
    не для всегда.
    1 апр 17, 11:54    [20356724]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    stax..
    стартовый вернул три строки
    добавляю (раскоментирую) level<=0
    Давай вернемся к тому, что написал я
    Еще одним важным моментом является то, что проверка условия connect by выполняется
    после возврата строк на текущем уровне. То есть если в условие соединения добавить level <= 1 и
    level <= 0, то в любом случае будут возвращены все строки первого уровня. Строки первого уровня
    должны удовлетворять условиям start with и where если таковые имеются.
    условие соединения - предикат в connect by
    условие фильтрации - предикат в where
    Выполни это
    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.
    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 было встречено во второй ветке.
    + нежданчик
    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
    Не очень правдива. Алгоритм обхода всегда в ширину. Меняется только порядок выдачи результата.
    1 апр 17, 19:30    [20357308]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    row_number()
    Maxim Demenko
    default windowing clause -
    order by ... range between unbounded preceding and current row
    не для всегда.
    Все верно, range. Для row_number вообще нельзя указывать windowing_clause.
    1 апр 17, 19:38    [20357323]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

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

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

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

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

    Как пример - рекурсия, зависящая от предыдущей строки
    +
    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стр )
    Нумерует птичек (\/) у которых одно из крыльев может отсутствовать. :)
    1 апр 17, 20:20    [20357391]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    stax..
    Guest
    dbms_photoshop
    stax..
    стартовый вернул три строки
    добавляю (раскоментирую) level<=0
    Давай вернемся к тому, что написал я
    Еще одним важным моментом является то, что проверка условия connect by выполняется
    после возврата строк на текущем уровне. То есть если в условие соединения добавить level <= 1 и
    level <= 0, то в любом случае будут возвращены все строки первого уровня. Строки первого уровня
    должны удовлетворять условиям start with и where если таковые имеются.
    условие соединения - предикат в connect by
    условие фильтрации - предикат в where
    Выполни это
    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_photoshop
    stax..
    стр 75
    Всегда имеет смысл указывать сортировку в левой части правил содержащих диапазоны ячеек, поскольку
    - в таком случае улучшается производительность

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

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

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

    Как пример - рекурсия, зависящая от предыдущей строки
    +
    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
    3 апр 17, 16:33    [20361801]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    blackmac
    Member

    Откуда:
    Сообщений: 354
    Спасибо, познавательный труд.
    5 апр 17, 15:32    [20369714]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Mr_Muscle
    Member

    Откуда:
    Сообщений: 108
    !Спасибо за труд!

    Очень познавательно. Особенно понравилось то, что много примеров и легко их воспроизвести.
    6 апр 17, 06:32    [20371434]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Mr_Muscle
    Member

    Откуда:
    Сообщений: 108
    На странице 23 получается небольшая неточность

    Запрос заполняет табличку днями недели
    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)
    6 апр 17, 06:45    [20371450]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Mr_Muscle,

    Спасибо, учту.
    6 апр 17, 11:57    [20372565]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    SQL*Plus
    Member

    Откуда: Россия, Москва
    Сообщений: 8131
    SQL*Plus
    dbms_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)
    SQL> SELECT ОТДЕЛЫ.ОТДЕЛ, ИМЯОТДЕЛА, ДОЛЖНОСТЬ, ФАМИЛИЯ
      2  FROM ОТДЕЛЫ, СОТРУДНИКИ
      3  WHERE ОТДЕЛЫ.ОТДЕЛ = СОТРУДНИКИ.ОТДЕЛ (+)
      4  ORDER BY ОТДЕЛЫ.ОТДЕЛ 
    

    Потом сделаю скан этой страницы и размещу здесь, чтобы осталась для истории... :-)
    7 апр 17, 12:52    [20377212]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Elic
    Member

    Откуда:
    Сообщений: 29990
    v5
    +
                      НПКО Мекомп при Минчермете
    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(+);


    7 апр 17, 13:03    [20377285]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Валерий Юринский
    Member

    Откуда: Москва, "ФОРС Дистрибуция"
    Сообщений: 1235
    Elic
    v5

    Это ещё одно подтверждение про (+) в ORACLE v5.

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

    Советская версия называлась КАРС, КАРС-32
    (Корневая Автоматизированная (?) Реляционная Система).
    7 апр 17, 13:17    [20377366]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Валерий Юринский,

    Вот и верь после этого сотрудникам Оракла. :))
    Хотя я помню, что не только у госпожи Колган встречал про шестую версию.
    На сайте Оракла можно нагуглить такой антиквариат
    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.
    7 апр 17, 13:37    [20377436]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Валерий Юринский
    Member

    Откуда: Москва, "ФОРС Дистрибуция"
    Сообщений: 1235
    dbms_photoshop
    Валерий Юринский,

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

    P.S. Книжку уже отсканировали.
    Жду, когда распознают в текст.
    7 апр 17, 13:47    [20377492]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    rekrabbe
    Member

    Откуда:
    Сообщений: 30
    Автор, а куда вы выкладываете новую версию книги, в первом сообщение есть ссылка на книгу, но там версия 1.0. или 1.0 пока и есть последняя?
    14 апр 17, 15:14    [20402584]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    rekrabbe
    пока и есть последняя?
    Да.

    PS. К сожалению, движок wordpress не позволяет удалить файл и загрузить с тем же именем, так что новую ссылку выложу здесь позже.
    14 апр 17, 15:20    [20402615]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    j2k
    Member

    Откуда: Новосибирск
    Сообщений: 550
    dbms_photoshop, блин как-то пропустил тему. Сейчас в "курилке" увидел сообщение про книгу, почитаю на досуге. Спасибо за труд.
    12 май 17, 15:55    [20476951]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Работа завершена.

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

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

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

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

    Все версии книги.
    6 июн 17, 01:27    [20541880]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Кстати, пару человек после первой части мне говорили "не слишком ли ты восхваляешь pattern matching? неплохо бы больше фактов".
    Надеюсь это требование удовлетворено.

    Еще важный момент что все скрипты для исходных данных находятся непосредственно в книге и в тех случаях, когда использовано dbms_random.seed, стоит про него не забывать для воспроизводимости результатов.
    6 июн 17, 01:31    [20541881]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    123йй
    Member

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

    Thx
    6 июн 17, 09:07    [20542099]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    booby
    Member

    Откуда:
    Сообщений: 2257
    dbms_photoshop
    Задача: для таблицы с числами получить сумму их всех возможных комбинаций
    ...
    Если бы в таблице были только первые три строки, select * from t_num where id < =3;
    ID NUM
    1 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-и.

    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
    )
    


    Видать, бином Ньютона, в средней школе, как-то мимо тебя просклизнул.
    6 июн 17, 17:00    [20544164]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    booby,

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

    В сгенерированных данных может быть какая-то магия (хотя я ее пока не вижу), но речь идет про общий случай.
    6 июн 17, 17:16    [20544245]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    booby
    Member

    Откуда:
    Сообщений: 2257
    dbms_photoshop,
    магия, вопросы...
    Смешной ты.
    6 июн 17, 17:19    [20544262]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    dbms_photoshop
    В сгенерированных данных может быть какая-то магия (хотя я ее пока не вижу), но речь идет про общий случай.
    Точнее, учитывая вполне фиксированную формулу для генерации можно вывести формулу для суммы всего, но это не то, что требуется.
    6 июн 17, 17:19    [20544263]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    booby
    dbms_photoshop,
    магия, вопросы...
    Смешной ты.
    Спасибо за твое замечание, booby. Хорошего дня.
    6 июн 17, 17:21    [20544270]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    env
    Member

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

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

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

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

    А вот для задачи с комбинациями строк таких формул сильно меньше.
    7 июн 17, 11:16    [20545979]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    env,

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

    Там дальше еще встречается сравнение запросов с select sum(...) вместо select * для того, чтоб минимизировать фетч.
    7 июн 17, 11:42    [20546160]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    мегамозг
    Member

    Откуда: Екатеринбург
    Сообщений: 71
    dbms_photoshop
    Кстати, изначально планировал еще три главы ...
  • Особенности DML в Oracle. Например, про update при наличии join ... и подобное.
    Это всё есть в блогах известных товарищей и прочих местах и заниматься просто компиляцией несколько нудно.

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

  • Я вот не припомню, чтобы в книгах по оракл было про апдейт или дилит с джойнами. В отличие от книг по MySQL или MS SQL.
    По-моему, это базовая вещь и обязательно должна присутствовать в любой книге по sql.
    Странно это.
    Или имелось в виду что-то отличное от
    --ms sql 
    update t set f1 = z.f2
    from table1 t
    join table2 z on t.k = z.k
    
    7 июн 17, 17:17    [20547887]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Vint
    Member

    Откуда: Москва
    Сообщений: 4564
    мегамозг,

    открой для себя merge
    7 июн 17, 17:43    [20547978]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Elic
    Member

    Откуда:
    Сообщений: 29990
    мегамозг
    Я вот не припомню, чтобы в книгах по оракл было про апдейт или дилит с джойнами.
    RTFM Updating a Join View (FAQ)
    7 июн 17, 17:45    [20547990]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    мегамозг,

    Я думал об этом написать, но описание самого апдейта требует много деталей и, кроме того, тянет за собой обсуждение merge и сравнение с реализацией update хотя бы в MSSQL. Мне не встречалось всестороннее освещение вопроса, хотя по отдельным моментам неплохие статьи есть. Вообще я это уже упомянул 20168274.
    7 июн 17, 17:45    [20547994]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    мегамозг
    Member

    Откуда: Екатеринбург
    Сообщений: 71
    Vint
    мегамозг,

    открой для себя merge

    Ты имеешь в виду merge как update/insert по совпадению?
    7 июн 17, 17:47    [20547999]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    мегамозг
    dbms_photoshop
    Кстати, изначально планировал еще три главы ...
  • Особенности DML в Oracle. Например, про update при наличии join ... и подобное.
    Это всё есть в блогах известных товарищей и прочих местах и заниматься просто компиляцией несколько нудно.

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

  • Я вот не припомню, чтобы в книгах по оракл было про апдейт или дилит с джойнами. В отличие от книг по MySQL или MS SQL.
    По-моему, это базовая вещь и обязательно должна присутствовать в любой книге по sql.
    Странно это.
    Или имелось в виду что-то отличное от
    --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

    Это все равно что скалярный подзапрос возвращает боле одной строки, а СУБД берет произвольно любую из них и успешно выполняет запрос.
    7 июн 17, 17:53    [20548017]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    мегамозг
    Vint
    мегамозг,

    открой для себя merge

    Ты имеешь в виду merge как update/insert по совпадению?
    Почему бы тебе сначала не отправиться в поиск?
    7 июн 17, 17:58    [20548028]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    env
    Member

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

    Печатное издание книги планируется или я всё пропустил?
    18 окт 17, 17:13    [20879804]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    env,

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

    При переводе были некоторые исправления и дополнения к финальной русской версии, но я её править больше не планирую.
    18 окт 17, 18:15    [20880018]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18373
    dbms_photoshop
    При переводе были некоторые исправления и дополнения к финальной русской версии, но я её править больше не планирую.

    Ну вот как всегда - "вычищенное" на аглицком :)
    18 окт 17, 19:40    [20880208]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    israelshamir
    Member

    Откуда:
    Сообщений: 198
    Откуда можно скачать вторую часть книги?
    23 окт 17, 16:45    [20893149]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    israelshamir,

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

    The Power of Oracle SQL. All versions

    Модератор: добавлено в стартовый ПОСТ


    Сообщение было отредактировано: 23 окт 17, 18:31
    23 окт 17, 16:53    [20893182]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    israelshamir
    Member

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

    эту ссылку я видел. Но при переходе: "Not published yet"((
    23 окт 17, 16:58    [20893204]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    israelshamir,

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

    Not published yet относится к инглиш версии.
    23 окт 17, 17:03    [20893222]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    israelshamir
    Member

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

    протормозил я что - то, извиняюсь. Книга замечательная, спасибо!
    24 окт 17, 08:06    [20894456]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    env
    Печатное издание книги планируется или я всё пропустил?
    Ровно через год после начала топика. :)
    Тынц (публично еще недоступно)

    Если кого из Москвы интересует - вероятно буду там в апреле, могу за полцены бокал пива передать.
    1 фев 18, 03:52    [21156252]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    env
    Member

    Откуда: Россия, Москва
    Сообщений: 6731
    dbms_photoshop
    Если кого из Москвы интересует

    +1 к nvl(кого из Москвы интересует,0)
    1 фев 18, 10:23    [21156684]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    xtender
    Member

    Откуда: Мск
    Сообщений: 5704
    dbms_photoshop,

    Поздравляю! Большое хорошее дело
    1 фев 18, 10:43    [21156783]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Vint
    Member

    Откуда: Москва
    Сообщений: 4564
    dbms_photoshop,
    Ждем тебя в апреле чтобы обмыть)) предупреди за пару недель чтобы собрать побольше народу)
    1 фев 18, 12:03    [21157126]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    гр к
    Guest
    dbms_photoshop, в описании релиза указано 240 страниц, а в файле пдф 182 страницы.
    В чём причина?
    1 фев 18, 13:05    [21157384]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    AmKad
    Member

    Откуда:
    Сообщений: 5222
    гр к
    dbms_photoshop, в описании релиза указано 240 страниц, а в файле пдф 182 страницы.
    В чём причина?
    Помимо того, что в книге может присутствовать дополнительный материал, средний размер страницы книги меньше А4. Насколько я помню, PDF у фотошопа - это не отсканированные страницы, а оцифрованный материал.
    1 фев 18, 13:56    [21157562]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    гр к,

    Я доработал до 200-210 страниц, остальное это результат форматирования издательства.
    Кардинально переработана и дополнена только глава 9 "Logical execution order of query clauses".
    Там, скажем так, был ряд misleading statements.
    1 фев 18, 15:26    [21158043]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Спасибо за отзывы, критику и комментарии.
    Без этого форума книги, наверное, не было бы.
    1 фев 18, 15:29    [21158056]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Валерий Юринский
    Member

    Откуда: Москва, "ФОРС Дистрибуция"
    Сообщений: 1235
    dbms_photoshop
    Спасибо за отзывы, критику и комментарии.
    Без этого форума книги, наверное, не было бы.
    Была бы!
    Но, возможно, несколько другая... :-)
    1 фев 18, 15:31    [21158061]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Валерий Юринский
    Member

    Откуда: Москва, "ФОРС Дистрибуция"
    Сообщений: 1235
    https://www.apress.com/gb/book/9781484233719
    Authors: Reprintsev, Alex
    Фамилия автора интересно выглядит в английском написании... :-)

    https://ru.wikipedia.org/wiki/Репринт
    Репри́нт (англ. to reprint — перепечатывать, переиздавать) — издание, выпуск которого
    осуществляется путём репродуцирования (сканирования) страниц книги, рукописи и прочих
    выбранных для воспроизведения источников с сохранением текста, но без воспроизведения
    особенностей материалов (бумаги, переплёта) и печати (дефектов, исправлений, опечаток)
    предыдущего издания. Последним свойством отличается от факсимиле.
    1 фев 18, 17:01    [21158354]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Валерий Юринский,

    Давайте будем фокусироваться на контенте, а не личностях.
    1 фев 18, 17:14    [21158409]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Валерий Юринский
    Member

    Откуда: Москва, "ФОРС Дистрибуция"
    Сообщений: 1235
    dbms_photoshop
    Валерий Юринский,

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

    P.S. Вместо "контент" я бы предпочёл использовать "содержание"
    1 фев 18, 19:23    [21158745]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    dbms_photoshop
    Member

    Откуда: sqlmdx.net
    Сообщений: 5151
    Валерий Юринский
    P.S. Вместо "контент" я бы предпочёл использовать "содержание"
    Вот я как раз имел в виду "содержимое", а не "содержание".
    Еще можно было сказать информационное наполнение, но громоздко и нелепо.

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

    Например, вместо попыток перевести immutable, persistent, multitenant и проч. я лучше использую слово оригинала общаясь в интернетах.
    1 фев 18, 20:09    [21158861]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    слово оригинала
    Guest
    dbms_photoshop
    я лучше использую слово оригинала общаясь в интернетах.

    Раскладку переключать лениво, а транскрипция... неее, лучше уж локализованный термин :)
    1 фев 18, 21:29    [21158996]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Vladimir Baskakov
    Member

    Откуда:
    Сообщений: 2006
    Спасибо. Возьму в изучение.
    1 фев 18, 21:33    [21159005]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    partiition-section, drop-delete
    Guest
    слово оригинала
    локализованный термин
    Есть немало старых терминов, которым до сих пор нет устоявшегося перевода из-за неоднозначности вариантов. Взять ЯСЗ, который пытались писать по началу в книгах. Много ли молодняка поймет, что это?
    Да и потом, в русском языке уже 70% терминов заимствованы. Как по-исконнорусски таблица или индекс??
    Или. Решил ты переводить column не как давно заимствованное колонка, а более русское поле. И тут бац - hybrid columnar compression - гибридное пополевое сжатие. Очень по-русский звучит "пополевое", а "полевое" не полностью отражает смысл термина.
    1 фев 18, 21:55    [21159051]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Память подводит
    Guest
    partiition-section, drop-delete
    ЯСЗ
    Это Ярославский Судостроительный Завод.
    А вот СЯЗ уже обсуждали.
    1 фев 18, 23:19    [21159171]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    ы!
    Guest
    Валерий Юринский
    https://www.apress.com/gb/book/9781484233719
    Authors: Reprintsev, Alex
    Фамилия автора интересно выглядит в английском написании... :-)

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


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

    Пользуясь случаем, автору топика - спасибо!
    2 фев 18, 10:17    [21159738]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Валерий Юринский
    Member

    Откуда: Москва, "ФОРС Дистрибуция"
    Сообщений: 1235
    dbms_photoshop
    Валерий Юринский
    P.S. Вместо "контент" я бы предпочёл использовать "содержание"
    Вот я как раз имел в виду "содержимое", а не "содержание".

    Это синонимы, но в данном случае "содержание" по смыслу ближе... :-)
    2 фев 18, 11:42    [21160058]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    шК0ДЕР
    Member

    Откуда: Издалека долго
    Сообщений: 1206
    dbms_photoshop, спасибо за труд!
    на 9 странице опечатка, первое предложение последнего абзаца, вероятно, пропущено слово "когда"
    The Power of Oracle SQL
    Концепция pre/post join предикатов применима только тогда имеется внешнее
    соединение.
    5 фев 18, 13:01    [21166563]     Ответить | Цитировать Сообщить модератору
     Re: The Power of Oracle SQL  [new]
    Чту по диагонали
    Guest
    Страница 72 - опечатка
    автор
    В обоих случаях мы имеем одинаковое число строк в результате, хотя при обходе в
    глубину ожидалось получить вес строки первой ветки, ведь ни одно из ее значений не равно 101.
    5 фев 18, 17:19    [21167596]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3 4 5      [все]
    Все форумы / Oracle Ответить