powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Размножить запись на несколько по количеству дней
11 сообщений из 11, страница 1 из 1
Размножить запись на несколько по количеству дней
    #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
Размножить запись на несколько по количеству дней
    #37749396
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Размножить записьСУБД: Oracle 10.2.0.4.0 64bit
Необходимо для каждой записи размножить её на несколько по количеству дней (DAYS), с прибавлением дня в дате для каждой последующей записи.

Данный запрос отрабатывает нормально, но когда пытаюсь применить к существующей таблице/вьюхе выскакивает ошибка "CONNECTED BY loop in user data".
Подскажите правильный ли запрос, куда копать или как можно ещё написать данный запрос?
..
кто же знает, что вы понаписали в запросе, который не работает ?
телепаты отдыхают
...
Рейтинг: 0 / 0
Размножить запись на несколько по количеству дней
    #37749435
Фотография 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
Размножить запись на несколько по количеству дней
    #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
Размножить запись на несколько по количеству дней
    #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
Размножить запись на несколько по количеству дней
    #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
Размножить запись на несколько по количеству дней
    #37749632
Фотография 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
Размножить запись на несколько по количеству дней
    #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
Период между сообщениями больше года.
Размножить запись на несколько по количеству дней
    #40005768
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какой из вариантов самый быстрый?
необходимо размножить 400тыс строк от 2 до 10 раз
Oracle 11.2.0.4
...
Рейтинг: 0 / 0
Размножить запись на несколько по количеству дней
    #40006121
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagor,

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

P.S. Не увидел, что у тебя старая версия Oracle.
...
Рейтинг: 0 / 0
Размножить запись на несколько по количеству дней
    #40006138
Фотография 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
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Размножить запись на несколько по количеству дней
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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