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

Откуда: деревня Ильбяково Азнакаевского района РТ
Сообщений: 442
хочу каждую из этих двух строк размножить loop_me_times раз

                        select level lev
                              ,loop_me_times
                              ,row_id
                        from (
                            select 3 loop_me_times,'1' row_id from dual
                            union all 
                            select 5 loop_me_times,'2' row_id  from dual
                        ) t
                        connect by --NOCYCLE 
                                       level <= loop_me_times
                                   and prior row_id = row_id
                                   --and dbms_random.value is not null


как сделать, чтобы оракл не ругался на цикл (ведь я сам контролирую этот цикл) ?
9 апр 19, 17:55    [21857572]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
Shredder2003
как сделать
Не маяться дурью. 21843586
9 апр 19, 18:14    [21857615]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9395
with t as (
           select 3 loop_me_times,'1' row_id from dual union all 
           select 5 loop_me_times,'2' row_id  from dual
          )
select  lev,
        loop_me_times,
        row_id
  from  t,
        lateral(
                select  level lev
                  from  dual
                  connect by level <= loop_me_times
               )
/

       LEV LOOP_ME_TIMES R
---------- ------------- -
         1             3 1
         2             3 1
         3             3 1
         1             5 2
         2             5 2
         3             5 2
         4             5 2
         5             5 2

8 rows selected.

SQL> 


SY.
10 апр 19, 03:37    [21857847]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
Shredder2003
Member

Откуда: деревня Ильбяково Азнакаевского района РТ
Сообщений: 442
Elic,

запрос, который привёл SY - это тоже маяние дурью?
Если да, то почему?
10 апр 19, 10:32    [21858027]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
Shredder2003
Если да, то почему?
Потому что плохо сопровождаемое баловство, пригодное, в основном, для форумов.
Но в отсутствие стремления к повторной используемости и на 12-ом - то можно.
10 апр 19, 10:43    [21858048]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1711
SY,

латерал шоб dbms_random/guid не использовать?

.....
stax
10 апр 19, 10:51    [21858060]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
AmKad
Member

Откуда:
Сообщений: 4953
Elic
Shredder2003
Если да, то почему?
Потому что плохо сопровождаемое баловство
И все-таки, почему?
10 апр 19, 13:02    [21858214]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
AmKad
И все-таки, почему?
Сопровождаемость падает с увеличением количества использованных структурных конструкций. Не?

Один плюс есть - не нужны дополнительные права.
10 апр 19, 13:11    [21858229]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
AmKad
Member

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

С озвученным критерием согласен. Но ведь использовать свой PL/SQL генератор - это необходимость поддерживать дополнительный хранимый объект. Ну а в сравнении с connect by + prior dbms_random.value is not null на мой взгляд специально придуманный для таких задач lateral выглядит прозрачнее.
10 апр 19, 13:19    [21858243]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
AmKad
Но ведь использовать свой PL/SQL генератор - это необходимость поддерживать дополнительный хранимый объект.
Утилитарный пакет подобного плана - просто muct have как встроенные функции.
AmKad
ateral выглядит прозрачнее
Лучше, да. Но connect by-генератор - это по-прежнему до сих пор незокументированный трюк. Который в разных версиях может отваливаться по нехватке памяти.
10 апр 19, 13:52    [21858285]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9395
Elic
Не маяться дурью. 21843586


Нy-ну:

SQL> select  banner
  2    from  v$version
  3  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for 64-bit Windows: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

SQL> set timing on
SQL> select avg(column_value) from table(pivot(101000000,1000000))
  2  /

AVG(COLUMN_VALUE)
-----------------
         51000000

Elapsed: 00:00:19.85
SQL> select avg(xmlcast(column_value as number)) from xmltable('1000000,101000000')
  2  /

AVG(XMLCAST(COLUMN_VALUEASNUMBER))
----------------------------------
                          51000000

Elapsed: 00:00:00.03
SQL> 


SY.
10 апр 19, 14:26    [21858333]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
AmKad
Member

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

Не, ну а вдруг оптимизатор настолько умен, что во втором случае просто сделал
select (101000000 + 1000000) / 2 joke
from dual;

      JOKE
----------
  51000000
10 апр 19, 14:29    [21858340]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
-2-
Member

Откуда:
Сообщений: 14504
AmKad
Не, ну а вдруг оптимизатор настолько умен, что во втором случае просто сделал
select (101000000 + 1000000) / 2 joke
from dual;

      JOKE
----------
  51000000
Именно это оракл и сделал. Но оптимизатор тут не причем.
10 апр 19, 14:38    [21858359]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1711
-2-
AmKad
Не, ну а вдруг оптимизатор настолько умен, что во втором случае просто сделал
select (101000000 + 1000000) / 2 joke
from dual;

      JOKE
----------
  51000000
Именно это оракл и сделал. Но оптимизатор тут не причем.

имхо
AmKad имел ввиду что оптимазатор посчитал xmltable('1000000,101000000') как константу и сразу вычислил среднее
(не разворачивая xmltable('1000000,101000000') в строки)

....
stax
10 апр 19, 14:47    [21858377]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
SY
xmltable
Т.е. connect by в сравнении даже не рассматривался? :)
10 апр 19, 14:54    [21858383]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
AmKad
Member

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

Да. Но при этом я считал, что этот xmltable призван развернуть все множество строк, хотя по факту выплевываются только две, о чем и сказал -2-.
10 апр 19, 14:55    [21858384]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9395
-2-
Именно это оракл и сделал. Но оптимизатор тут не причем.


Упс. Посыпаю голову пеплом. Дожно быть TO а не зпт. Да, XMLTABLE в разы медленнее.

SY.
10 апр 19, 15:14    [21858411]     Ответить | Цитировать Сообщить модератору
 Re: как подавить connect by loop и размножить строки по ID в 12 версии?  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28823
xmltable('1000000,101000000')
Соломон отлично продемонстрирован, что любой инструмент, используемый не совсем по назначению, может быть использован неправильно.
+
Правильно использованный для генерации xmltable, естественно, чудовищно проигрывает.
10 апр 19, 15:20    [21858420]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить