Цикл каждой записи из таблицы и вычисленной записи в другую таблицу в Oracle - PullRequest
1 голос
/ 23 октября 2010

Я новичок в Oracle 10g.У меня есть несколько таблиц, как показано ниже:

INCOME_MASTER
INCOME_ID     NUMBER(10) sEQ NUMBER,
INCOME_TYPE   VARCHAR2(10),
INCOME_DATE   DATE

INCOME_DETAILS
INCOME_DETAILS_SEQ_NO     NUMBER(10) SEQUENCE,
INCOME_ID                 NUMBER(10),
ITEM_ID                   NUMBER(10),
ITEM_VALUE                NUMBER (10,2)

У меня есть много значений в обеих таблицах.

Мне нужно запросить все записи из таблицы INCOME_MASTER и для каждой каждой записив таблице INCOME_MASTER мне нужно перебрать

SELECT INCOME_ID FROM INCOME_MASTER
select ITEM_VALUE FROM INCOME_DETAILS WHERE INCOME_ID= FROM above query and ITEM_ID=201
select ITEM_VALUE FROM INCOME_DETAILS WHERE INCOME_ID= FROM above query and ITEM_ID=202
select ITEM_VALUE FROM INCOME_DETAILS WHERE INCOME_ID= FROM above query and ITEM_ID=203
select ITEM_VALUE FROM INCOME_DETAILS WHERE INCOME_ID= FROM above query and ITEM_ID=204

Мне нужно добавить значения из ITEM_ID 202,203,204 и вычесть значение из ITEM_ID = 201 value

любое полученное значение мне нужно вставитьновая запись в INCOME_DETAILS

insert into INCOME_DETAILS 
  values(INCOME_ID,205,value from above)

Я хочу сделать это для всех записей в таблице Income_master

Ответы [ 2 ]

0 голосов
/ 26 октября 2010

Я согласен с clyc, вам нужно думать в наборах.Если нам не хватает подробностей, эта операция не нуждается в процедурном коде.

Пример данных:

create table income_master (
   income_id   number(10),
   income_type varchar2(10),
   income_date date
   );

create table income_details (
   income_details_seq_no number(10),
   income_id             number(10),
   item_id               number(10),
   item_value            number(10,2)
   );

insert into income_master values (1,'a',sysdate);
insert into income_master values (2,'b',sysdate);
insert into income_master values (3,'c',sysdate);
insert into income_master values (4,'d',sysdate);

insert into income_details values(1,1,201,1);
insert into income_details values(2,1,202,20);
insert into income_details values(3,1,203,300);
insert into income_details values(4,1,204,4000);

insert into income_details values(5,2,201,1);
insert into income_details values(6,2,202,20);
insert into income_details values(7,2,203,300);

insert into income_details values(8,3,201,10);
insert into income_details values(9,3,202,20);
insert into income_details values(10,3,203,30);

insert into income_details values(11,4,202,-90);
insert into income_details values(12,4,202,-10);

Вставить оператор:

INSERT INTO Income_Details (Income_Id, Item_Id, Item_Value) 
(
  SELECT ma.Income_Id, 205, SUM(DECODE(de.Item_ID,201,-1,1) * de.Item_Value) 
  FROM Income_Master ma
  JOIN Income_Details de ON ma.Income_Id = de.Income_Id 
     AND de.Item_Id BETWEEN 201 and 204
  GROUP BY ma.Income_Id, 205
);

Результаты:

select Income_Id, Item_Id, Item_Value from income_details WHERE Item_Id = 205;
INCOME_ID              ITEM_ID                ITEM_VALUE             
---------------------- ---------------------- ---------------------- 
3                      205                    40                     
1                      205                    4319                   
2                      205                    319                    
4                      205                    -100                     
0 голосов
/ 23 октября 2010

Мой оракул ржавый, но должно быть что-то вроде этого ... При работе с sql вы хотите думать по сетам, а не по строкам.Вы можете прокомментировать первую строку и запустить ее для предварительного просмотра данных, которые будут вставлены в вашу таблицу.

INSERT INTO INCOME_DETAILS(INCOME_ID, ITEM_ID, ITEM_VALUE)
SELECT  INCOME_MASTER.INCOME_ID, 205, b+c+d-a
FROM    INCOME_MASTER
        INNER JOIN 
        (
            SELECT  INCOME_MASTER.INCOME_ID, 
                    SUM(DECODE(ITEM_ID, 201, ITEM_VALUE, 0)) a,
                    SUM(DECODE(ITEM_ID, 202, ITEM_VALUE, 0)) b,
                    SUM(DECODE(ITEM_ID, 203, ITEM_VALUE, 0)) c,
                    SUM(DECODE(ITEM_ID, 204, ITEM_VALUE, 0)) d
            FROM    INCOME_MASTER
                    INNER JOIN INCOME_DETAILS
                        ON INCOME_MASTER.INCOME_ID = INCOME_DETAILS.INCOME_ID
            WHERE   INCOME_DETAILS.ITEM_ID IN (201,202,203,204)
            GROUP BY INCOME_MASTER.INCOME_ID
        ) details
            ON INCOME_MASTER.INCOME_ID = details.INCOME_ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...