Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Размножить запись на несколько по количеству дней / 11 сообщений из 11, страница 1 из 1
11.04.2012, 21:56
    #37749387
Размножить запись на несколько по количеству дней
СУБД: Oracle 10.2.0.4.0 64bit
Необходимо для каждой записи размножить её на несколько по количеству дней (DAYS), с прибавлением дня в дате для каждой последующей записи.

Данный запрос отрабатывает нормально, но когда пытаюсь применить к существующей таблице/вьюхе выскакивает ошибка "CONNECTED BY loop in user data".
Подскажите правильный ли запрос, куда копать или как можно ещё написать данный запрос?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with
  t as
    (
      select 1 as ID, to_date('10.02.2011') as STARTDATE, 4 as DAYS from dual 
      union all  select 2, to_date('01.05.2011'), 2 from dual
      union all  select 3, to_date('15.01.2011'), 3 from dual
    )
select t.*, STARTDATE + level-1 as CURDATE, DAYS, level
  from t
connect by prior DAYS = DAYS
       and prior dbms_random.value is not null
       and level <= DAYS
...
Рейтинг: 0 / 0
11.04.2012, 22:02
    #37749396
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размножить запись на несколько по количеству дней
Размножить записьСУБД: Oracle 10.2.0.4.0 64bit
Необходимо для каждой записи размножить её на несколько по количеству дней (DAYS), с прибавлением дня в дате для каждой последующей записи.

Данный запрос отрабатывает нормально, но когда пытаюсь применить к существующей таблице/вьюхе выскакивает ошибка "CONNECTED BY loop in user data".
Подскажите правильный ли запрос, куда копать или как можно ещё написать данный запрос?
..
кто же знает, что вы понаписали в запросе, который не работает ?
телепаты отдыхают
...
Рейтинг: 0 / 0
11.04.2012, 22:43
    #37749435
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размножить запись на несколько по количеству дней
Размножить запись,

And what the... is this:

Код: plsql
1.
connect by prior DAYS = DAYS



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
with
  t as
    (
      select 1 as ID, to_date('10.02.2011','dd.mm.yyyy') as STARTDATE, 4 as DAYS from dual 
      union all  select 2, to_date('01.05.2011','dd.mm.yyyy'), 2 from dual
      union all  select 3, to_date('15.01.2011','dd.mm.yyyy'), 3 from dual
    )
select t.*, STARTDATE + level-1 as CURDATE, DAYS, level
  from t
connect by prior ID = ID
       and prior dbms_random.value is not null
       and level <= DAYS
/

        ID STARTDATE       DAYS CURDATE         DAYS      LEVEL
---------- --------- ---------- --------- ---------- ----------
         1 10-FEB-11          4 10-FEB-11          4          1
         1 10-FEB-11          4 11-FEB-11          4          2
         1 10-FEB-11          4 12-FEB-11          4          3
         1 10-FEB-11          4 13-FEB-11          4          4
         2 01-MAY-11          2 01-MAY-11          2          1
         2 01-MAY-11          2 02-MAY-11          2          2
         3 15-JAN-11          3 15-JAN-11          3          1
         3 15-JAN-11          3 16-JAN-11          3          2
         3 15-JAN-11          3 17-JAN-11          3          3

9 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
12.04.2012, 00:37
    #37749522
Размножить запись на несколько по количеству дней
Вот так вот не работает. Хотя по идее суть то та же?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select t.*, STARTDATE + level-1 as CURDATE, DAYS, level
  from (
      select 1 as ID, to_date('10.02.2011','dd.mm.yyyy') as STARTDATE, 4 as DAYS from dual 
      union all  select 2, to_date('01.05.2011','dd.mm.yyyy'), 2 from dual
      union all  select 3, to_date('15.01.2011','dd.mm.yyyy'), 3 from dual
    ) t
connect by prior ID = ID
       and prior dbms_random.value is not null
       and level <= DAYS
...
Рейтинг: 0 / 0
12.04.2012, 01:23
    #37749553
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размножить запись на несколько по количеству дней
Размножить записьВот так вот не работает. Хотя по идее суть то та же?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select t.*, STARTDATE + level-1 as CURDATE, DAYS, level
  from (
      select 1 as ID, to_date('10.02.2011','dd.mm.yyyy') as STARTDATE, 4 as DAYS from dual 
      union all  select 2, to_date('01.05.2011','dd.mm.yyyy'), 2 from dual
      union all  select 3, to_date('15.01.2011','dd.mm.yyyy'), 3 from dual
    ) t
connect by prior ID = ID
       and prior dbms_random.value is not null
       and level <= DAYS


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select t.*, STARTDATE + level-1 as CURDATE, DAYS, level
  2    from (
  3        select 1 as ID, to_date('10.02.2011','dd.mm.yyyy') as STARTDATE, 4 as DAYS from dual
  4        union all  select 2, to_date('01.05.2011','dd.mm.yyyy'), 2 from dual
  5        union all  select 3, to_date('15.01.2011','dd.mm.yyyy'), 3 from dual
  6      ) t
  7  connect by prior ID = ID
  8         and prior dbms_random.value is not null
  9         and level <= DAYS;

        ID STARTDATE       DAYS CURDATE         DAYS      LEVEL
---------- --------- ---------- --------- ---------- ----------
         1 10-FEB-11          4 10-FEB-11          4          1
         1 10-FEB-11          4 11-FEB-11          4          2
         1 10-FEB-11          4 12-FEB-11          4          3
         1 10-FEB-11          4 13-FEB-11          4          4
         2 01-MAY-11          2 01-MAY-11          2          1
         2 01-MAY-11          2 02-MAY-11          2          2
         3 15-JAN-11          3 15-JAN-11          3          1
         3 15-JAN-11          3 16-JAN-11          3          2
         3 15-JAN-11          3 17-JAN-11          3          3

9 rows selected.
 
...
Рейтинг: 0 / 0
12.04.2012, 02:40
    #37749599
Размножить запись на несколько по количеству дней
Сейчас проверил.
Oracle 11g 11.1.0.7.0 32bit - Работает
Oracle 10g 10.2.0.4.0 64bit - Не работает (ORA-01436 :CONNECTED BY loop in user data )

Короче косяк десятки исправленный в 11ке.
...
Рейтинг: 0 / 0
12.04.2012, 05:47
    #37749632
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размножить запись на несколько по количеству дней
Размножить записьOracle 10g 10.2.0.4.0 64bit - Не работает (ORA-01436 :CONNECTED BY loop in user data )
Короче косяк десятки исправленный в 11ке.

Ecли в 10.2.0.4.0 не работает тo или нa урoвнe 64bit или нa урoвнe OS:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
SQL> select  *
  2    from  v$version
  3  /

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for 32-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

SQL> with
  2    t as
  3      (
  4        select 1 as ID, to_date('10.02.2011','dd.mm.yyyy') as STARTDATE, 4 as DAYS from dual 
  5        union all  select 2, to_date('01.05.2011','dd.mm.yyyy'), 2 from dual
  6        union all  select 3, to_date('15.01.2011','dd.mm.yyyy'), 3 from dual
  7      )
  8  select t.*, STARTDATE + level-1 as CURDATE, DAYS, level
  9    from t
 10  connect by prior ID = ID
 11         and prior dbms_random.value is not null
 12         and level <= DAYS
 13  /

        ID STARTDATE       DAYS CURDATE         DAYS      LEVEL
---------- --------- ---------- --------- ---------- ----------
         1 10-FEB-11          4 10-FEB-11          4          1
         1 10-FEB-11          4 11-FEB-11          4          2
         1 10-FEB-11          4 12-FEB-11          4          3
         1 10-FEB-11          4 13-FEB-11          4          4
         2 01-MAY-11          2 01-MAY-11          2          1
         2 01-MAY-11          2 02-MAY-11          2          2
         3 15-JAN-11          3 15-JAN-11          3          1
         3 15-JAN-11          3 16-JAN-11          3          2
         3 15-JAN-11          3 17-JAN-11          3          3

9 rows selected.

SQL> 



Но в любом случае использование dbms_random для обхода CONNECT BY loop не документировано. Я предпочитаю:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SQL> with
  2    t as
  3      (
  4        select 1 as ID, to_date('10.02.2011','dd.mm.yyyy') as STARTDATE, 4 as DAYS from dual
  5        union all  select 2, to_date('01.05.2011','dd.mm.yyyy'), 2 from dual
  6        union all  select 3, to_date('15.01.2011','dd.mm.yyyy'), 3 from dual
  7      )
  8  select t.*, STARTDATE + lvl-1 as CURDATE, DAYS, lvl
  9    from t,
 10         (
 11          select  level lvl
 12            from  dual
 13            connect by level <= (select max(DAYS) from t)
 14         )
 15    where lvl <= DAYS
 16  /

        ID STARTDATE       DAYS CURDATE         DAYS        LVL
---------- --------- ---------- --------- ---------- ----------
         1 10-FEB-11          4 10-FEB-11          4          1
         2 01-MAY-11          2 01-MAY-11          2          1
         3 15-JAN-11          3 15-JAN-11          3          1
         1 10-FEB-11          4 11-FEB-11          4          2
         2 01-MAY-11          2 02-MAY-11          2          2
         3 15-JAN-11          3 16-JAN-11          3          2
         1 10-FEB-11          4 12-FEB-11          4          3
         3 15-JAN-11          3 17-JAN-11          3          3
         1 10-FEB-11          4 13-FEB-11          4          4

9 rows selected.



или

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
SQL> with
  2    t as
  3      (
  4        select 1 as ID, to_date('10.02.2011','dd.mm.yyyy') as STARTDATE, 4 as DAYS from dual
  5        union all  select 2, to_date('01.05.2011','dd.mm.yyyy'), 2 from dual
  6        union all  select 3, to_date('15.01.2011','dd.mm.yyyy'), 3 from dual
  7      )
  8  select t.*, STARTDATE + column_value-1 as CURDATE, DAYS, column_value
  9    from t,
 10         table(
 11               cast(
 12                    multiset(
 13                             select  level
 14                               from  dual
 15                               connect by level <= DAYS
 16                            )
 17                    as sys.OdciNumberList
 18                   )
 19              )
 20  /

        ID STARTDATE       DAYS CURDATE         DAYS COLUMN_VALUE
---------- --------- ---------- --------- ---------- ------------
         1 10-FEB-11          4 10-FEB-11          4            1
         1 10-FEB-11          4 11-FEB-11          4            2
         1 10-FEB-11          4 12-FEB-11          4            3
         1 10-FEB-11          4 13-FEB-11          4            4
         2 01-MAY-11          2 01-MAY-11          2            1
         2 01-MAY-11          2 02-MAY-11          2            2
         3 15-JAN-11          3 15-JAN-11          3            1
         3 15-JAN-11          3 16-JAN-11          3            2
         3 15-JAN-11          3 17-JAN-11          3            3

9 rows selected.

SQL> 



SY.
...
Рейтинг: 0 / 0
12.04.2012, 10:42
    #37749865
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размножить запись на несколько по количеству дней
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
with t as (
select 1 as ID, to_date('10.02.2011', 'dd.mm.yyyy') as STARTDATE, 4 as DAYS from dual
union all  select 2, to_date('01.05.2011', 'dd.mm.yyyy'), 2 from dual
union all  select 3, to_date('15.01.2011', 'dd.mm.yyyy'), 3 from dual)
select id, sd
from t
model
partition by (id)
dimension by (0 d)
measures (startdate sd, days)
rules
(sd[for d from 0 to days[0] increment 1] = sd[0] + cv(d)
);

        ID SD
---------- -------------------
         1 10.02.2011 00:00:00
         1 11.02.2011 00:00:00
         1 12.02.2011 00:00:00
         1 13.02.2011 00:00:00
         1 14.02.2011 00:00:00
         2 01.05.2011 00:00:00
         2 02.05.2011 00:00:00
         2 03.05.2011 00:00:00
         3 15.01.2011 00:00:00
         3 16.01.2011 00:00:00
         3 17.01.2011 00:00:00
         3 18.01.2011 00:00:00

12 строк выбрано.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.10.2020, 15:17
    #40005768
feagor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размножить запись на несколько по количеству дней
Какой из вариантов самый быстрый?
необходимо размножить 400тыс строк от 2 до 10 раз
Oracle 11.2.0.4
...
Рейтинг: 0 / 0
07.10.2020, 13:23
    #40006121
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размножить запись на несколько по количеству дней
feagor,

С тех пор lateral появился. Попробуй еще и его.

P.S. Не увидел, что у тебя старая версия Oracle.
...
Рейтинг: 0 / 0
07.10.2020, 13:43
    #40006138
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размножить запись на несколько по количеству дней
feagor
Какой из вариантов самый быстрый?
необходимо размножить 400тыс строк от 2 до 10 раз
Oracle 11.2.0.4


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
WITH DRIVER AS (
                SELECT  LEVEL L
                  FROM  DUAL
                  CONNECT BY LEVEL <= 10
               )
SELECT  T.*,
        D.L
  FROM  YOUR_TABLE T,
        DRIVER D
  WHERE D.L <= T.REPEAT_COUNT
/



SY.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Размножить запись на несколько по количеству дней / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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