Циклическое заполнение (PL/SQL)

Olostan
Дата: 09.08.2005 13:22:36
Вот такая ситуация:
Есть результаты одного запроса. К примеру
SELECT a_id FROM tablle_a WHERE a_col>5

Есть вторая таблица с полем b_a_id.
И вот что интересно: как зполнить эту вторую таблицу (table_b к примеру) циклически-повторяемыми значениями из первой выборки.

То есть чтоб было что-то вроде:

table_a:

SELECT a_id FROM tablle_a WHERE a_col>5
A_ID
------
a
b
c

SELECT b_id, b_a_id FROM table2
B_ID        B_A_ID
--------------------
1           a
2           b
3           c
4           a
5           b


Пока единственное, что приходит в голову, выбрать из первой таблицы в некий массив (или табличку), а потом проходясь по второй апдейтить их используя значение в массиве под номером "счётчик_изменений MOD всего_в_массиве"... Возможно ли такое и может есть более простой способ?
Oleg Afanasiev
Дата: 09.08.2005 13:26:59
Заюзать декартово произведение

-----------------------
Вечны налоги,
Смерть и потеря данных.
Что на этот раз?
Картинка с другого сайта.
Vint
Дата: 09.08.2005 13:47:43
а вариант типа
insert into t as
select d.* from (select 1 from dual 
                        union 
                       select 2 from dual) d, 
                     all_objects
подойдет, если нет то ПОИСК подойдет точно недавно подобная тема обсуждалась
Stax.
Дата: 09.08.2005 13:55:28
Почему 5 записей, это параметр?
Stax.
Дата: 09.08.2005 14:42:52
select x,A_ID from
 (select count(*) cc from table_a) c
,(select rownum r,a_id from (select A_ID from table_a order by a_id) order by null) a
,pivot p
where
 x<=5
 and mod(x-1,cc)+1=r
order by 1
/
SQL> /

        X A_ID
--------- ------
        1 a
        2 b
        3 c
        4 a
        5 b
Olostan
Дата: 09.08.2005 15:18:38
Stax.
Почему 5 записей, это параметр?

5 как кол-во второй выборки (ну или размер второй таблицы).

По поводу твоего скрипта можно глупый вопрос: откуда там берёться "x" (во from нет вроде) и что такое "pivot p"?
Stax.
Дата: 09.08.2005 15:32:07
Olostan
Stax.
Почему 5 записей, это параметр?

5 как кол-во второй выборки (ну или размер второй таблицы).

По поводу твоего скрипта можно глупый вопрос: откуда там берёться "x" (во from нет вроде) и что такое "pivot p"?

Так строк же нет во второй, или я чего не понял?

Звиняюсь, насчет pivot, это я виноват,
надо любую "выборку" с 1 до n(5),
напр с all_objects или генерить

SQL> select * from pivot where x<11;
        X
---------
        1
        2
        3
        4
        5
        6
        7
        8
        9
       10
10 rows selected.
Andrew Max
Дата: 09.08.2005 16:12:32
Olostan
Вот такая ситуация
...

Неясны два момента:
1. Как упорядочен результат первого запроса (a b c)? Это важно, так как повлияет на результат заполнения таблицы table2.
2. Поле table2.b_id используется в качестве "номера", по которому ведется поиск подходящей строки в table_a.a_id?

В общем, рассмотрите такой вариант:
SQL> create table table_a (a_id varchar2(1));

Таблица создана.

SQL> begin
  2   insert into table_a values('a');
  3   insert into table_a values('b');
  4   insert into table_a values('c');
  5   commit;
  6  end;
  7  /

Процедура PL/SQL успешно завершена.

SQL> create table table2(b_id int, b_a_id varchar2(1));

Таблица создана.

SQL> insert into table2(b_id)
  2  select rownum
  3   from all_objects
  4   where rownum <= 8;

8 строк создано.

SQL> commit;

Фиксация обновлений завершена.

SQL> select * from table2 order by 1;

      B_ID B
---------- -
         1
         2
         3
         4
         5
         6
         7
         8

8 строк выбрано.

SQL> update table2 t2
  2  set t2.b_a_id =
  3   (select ta.a_id
  4     from
  5      (
  6       select rownum rn, a_id
  7        from table_a
  8        order by a_id
  9      ) ta
 10     where ta.rn = mod(t2.b_id - 1, (select count(*) from table_a)) + 1);

8 строк обновлено.

SQL> select * from table2 order by 1;

      B_ID B
---------- -
         1 a
         2 b
         3 c
         4 a
         5 b
         6 c
         7 a
         8 b

8 строк выбрано.
Olostan
Дата: 09.08.2005 16:53:47
Andrew Max, у Вас просто талант телепата: я действительно не полностью изъяснил ситуацию, но ответ совершенно точно отобразил желаемое. Во всяком случае, дал толчек к правильному решению :)

Спасибо.