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

Откуда:
Сообщений: 101
Доброго времени суток!

Стоит задача написать скрипт/процедуру, которая проходилась бы по таблице и в зависимости от данных, имеющихся в ней обновляла бы таблицу. Например. Есть исходная таблица:
поле1поле2поле3требуемое количество строкполе 5
dfgdfvgskjl3sdfg
sdfgsdfgdsdgsd2sdfghd
...............

После работы скрипта надо чтобы стало вот так:
поле1поле2поле3требуемое количество строкполе 5
dfgdfvgskjl0sdfg
dfgdfvgskjl0sdfg
dfgdfvgskjl0sdfg
sdfgsdfgdsdgsd0sdfghd
sdfgsdfgdsdgsd0sdfghd
...............

Т.е. по сути ищем все строки, где требуемое количество строк >0 (а в данном случае когда таблица та же то > 1) и их копируем столько раз, сколько надо (добавляем записи) а птом обновляем количество у исходной строки на 0.
Также вариант такого копирования в новую таюлицу будет возможно актуален. Очень буду благодарен за помощь, советы!

Большое спасибо!
3 окт 14, 09:46    [16654303]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
Vint
Member

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

merdge+размножить строки.
3 окт 14, 10:08    [16654399]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
MakPol
Member

Откуда:
Сообщений: 101
Если не сложно, можно на примерчеке каком-нибудь?
3 окт 14, 10:17    [16654443]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
как варинат:
1) Пускаешь таблицу в курсорном цикле
2) Внутри этого цикла пускаешь другой цик от 1.. до имя_курсора.кол_во_строк минус 1
3) Внутри второго цикла инсертишь записи в ту же таблицу.
4) Закрываешь циклы и скопом апдейтишь кол-во строк в ноль.
3 окт 14, 10:25    [16654472]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
MakPol
Member

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

Осталось перевести все это в код. Попробую. Большое спасибо!
3 окт 14, 10:43    [16654615]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
MakPol,
лучше попробуй написать это же селектом, а потом вставить в merge. будет быстрее)
3 окт 14, 10:57    [16654704]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
moishamiem
Member

Откуда: ЧФ
Сообщений: 164
with t as (
	select 'a' x, 5 y from dual union all 
	select 'b' x, 5 y from dual
) 
select X,0 from 
	t, 
	(select level l from dual connect by level<=(select max(y) from t)) d
where t.y>=d.l;


Ну вот как-то так, например. Насчет "будет быстрее" я бы не стал категорично утверждать, все зависит от данных.

Ну и вариант MonteCarlos более понятен и практичен с точки зрения алгоритма, с недавних пор я постиг дзен и понял, что стремится решить задачу одним запросом ради решения задачи одним запросом пустая трата времени, необходимо иметь более существенные причины для этого.
3 окт 14, 11:41    [16654993]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
stax..
Guest
moishamiem
with t as (
	select 'a' x, 5 y from dual union all 
	select 'b' x, 5 y from dual
) 
select X,0 from 
	t, 
	(select level l from dual connect by level<=(select max(y) from t)) d
where t.y>=d.l;


Ну вот как-то так, например. Насчет "будет быстрее" я бы не стал категорично утверждать, все зависит от данных.

Ну и вариант MonteCarlos более понятен и практичен с точки зрения алгоритма, с недавних пор я постиг дзен и понял, что стремится решить задачу одним запросом ради решения задачи одним запросом пустая трата времени, необходимо иметь более существенные причины для этого.

тут даж до мерже вопрос интересен
как генерить
мож model?

ps
я за пл/ескул
....
stax
3 окт 14, 19:55    [16658568]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
MonteCarlos
Member

Откуда:
Сообщений: 547
Дзен это круто, надо его постигать, но иной раз мозг дает трещину, ты просыпаешься среди ночи от того, что тебя поддрачивает вопрос - как все-таки можно было завалить этого мамонта одним sql запрсом.))
stax..
ину
тут даж до мерже вопрос интересен
как генерить
мож model?

moishamiem нормально сгенерил, осталось смержить

create table t as 
with t as (
  select 111 n, 'a' x, 5 y from dual union all 
  select 111 n, 'a' x, 7 y from dual union all 
  select 333 n, 'b' x, 3 y from dual union all 
  select 444 n, 'c' x, 1 y from dual
) 
select * from t

merge into t
using (select t.n, t.x, t.y, l, t.rowid rwd
       from t, (select level l from dual connect by level <= (select max(y) from t)) d
       where t.y >= d.l) s
on (t.rowid = s.rwd and s.l = 1)
when matched then 
update set t.y = 0
when not matched then
insert (t.n, t.x, t.y) values (s.n, s.x, 0);
3 окт 14, 20:42    [16658741]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
stax..
Guest
MonteCarlos
Дзен это круто, надо его постигать, но иной раз мозг дает трещину, ты просыпаешься среди ночи от того, что тебя поддрачивает вопрос - как все-таки можно было завалить этого мамонта одним sql запрсом.))
stax..
ину
тут даж до мерже вопрос интересен
как генерить
мож model?

moishamiem нормально сгенерил, осталось смержить

create table t as 
with t as (
  select 111 n, 'a' x, 5 y from dual union all 
  select 111 n, 'a' x, 7 y from dual union all 
  select 333 n, 'b' x, 3 y from dual union all 
  select 444 n, 'c' x, 1 y from dual
) 
select * from t

merge into t
using (select t.n, t.x, t.y, l, t.rowid rwd
       from t, (select level l from dual connect by level <= (select max(y) from t)) d
       where t.y >= d.l) s
on (t.rowid = s.rwd and s.l = 1)
when matched then 
update set t.y = 0
when not matched then
insert (t.n, t.x, t.y) values (s.n, s.x, 0);

да шо там мержить
я о своей давней загадкой, как оракляче правильно генерить недостающие данные
посмотрите план connect by, он не так прост

.....
stax
3 окт 14, 21:22    [16658891]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование данных в таблице в зависимости от самих данных  [new]
stax..
Guest
MonteCarlos
как все-таки можно было завалить этого мамонта одним sql запрсом.))

вопрос как завалить оракдя?
1) читаем металинк и валим
2) нарвались
3) по совету "друга" попробовал
4) циклім (не интересно)
5) OS
6) другое

зы
в монопольном режиме мерже с "Преобразование данных в таблице в зависимости от самих данных " должен справітся

.....
stax
3 окт 14, 21:30    [16658927]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить