2016-12-08 3 views
2

Я создал новую таблицу для моего использования, скажем, t1, в которой есть 8 столбцов. Я заполнил 3 столбца через процедуру. Столбец 1 - это имя. Теперь я хочу заполнить 4-й столбец для соответствующего имени. Это будет обновление с предложением where.Обновление одной таблицы из другой таблицы

Сценарий Я создал запрос, который имеет результат, называя t2, который имеет имя и total_amount. Теперь я хочу заполнить total_amount в 4-й столбец t1.

Подход, который я сейчас выполняю, - это перебирать каждое имя в t1 и находить свой счетчик total_amount в t2 (с предложением) и обновлять значение в t1. Но это занимает бесконечное время. Во-первых, из-за цикла в t1, во-вторых, t2 сам является запросом, который выполняется снова и снова.

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

create or replace procedure proc 
is 

temp_value number(18,2); 

CURSOR total is 
select name, age, sex from data_table where 
{conditions}; 

/*Gives me name and age in 1st and 2nd column and likewise data in 3rd column */ 

begin 

FOR temp IN total LOOP 

    with aa as (SELECT b.name, 
     NVL (SUM (c.amount), 0) as total_amount 
    FROM data_table2 b, data_table3 c 
    WHERE  {joins and groub by} 
    ) 
    /* This gives me total amount for corresponding name. There is no repetition of name */ 

    select nvl(sum(total_amount),0) into temp_value from aa where name = temp.name; 

    update t1 set amount = temp_value where name = temp.name; 

    END LOOP; 

END; 
/
+1

Вы используете MySQL, MS SQL Server или Oracle здесь? Не помещайте те продукты, которые не задействованы ... – jarlh

+0

можете ли вы представить свои таблицы в схеме? – anatol

+0

@jarlh Я использую Oracle здесь. Извините за теги – Akshay

ответ

0

Не можете добавить комментарий к заданию, отсюда его поместить.

За ваш пример:

with aa as (SELECT b.name, 
    NVL (SUM (c.amount), 0) as total_amount 
FROM data_table2 b, data_table3 c 
WHERE  {joins and groub by} 
) 
/* This gives me total amount for corresponding name. There is no repetition of name */ 

select nvl(sum(total_amount),0) into temp_value from aa where name = temp.name; 

update t1 set amount = temp_value where name = temp.name; 

В вашем с пунктом вы взять некоторую сумму, а затем заполнить сумму тех суммы для всех имен в курсоре. Почему вы не можете это сделать прямо:

SELECT SUM(NVL(total_amount, 0)) INTO temp_vale FROM 
     data_tabl1, data_tabl2, data_tabl3 
     WHERE 
     --JOIN CONDITIONS 
     AND data_tabl1.total)name = --data_tabl2/3.name 
    GROUP BY --clause; 

Почему я говорю это, с предложением не всегда хорошая идея. Если ваш «с» имеет огромные данные, он будет работать вечно. «С» используется, чтобы заботиться о повторяющихся таблицах, когда маленькие данные соединяются снова и снова.

Также для настройки настройте несколько советов.

Кроме того, NVL (SUM ..) почему бы не SUM (NVL (total_amount, 0))?

Смежные вопросы