Эффективный подход к заполнению временной таблицы - PullRequest
1 голос
/ 01 апреля 2012
Default_accounts
========================
p_type        varchar2
t_type        varchar2
A         varchar2
B         varchar2
C             varchar2
D             varchar2
=========================

p_type и t_type - это первичный ключ таблицы

p_type  t_type  A   B  C  D
============================
apple    sell   Y   N  N  Y
banana   buy    N   N  N  Y
orange   sell   Y   N  N  N
mango    buy    Y   Y  N  Y
papaya   buy    Y   N  N  Y
apple    buy    Y   N  N  Y
banana   sell   Y   Y  Y  Y
============================


 Accounts_Exceptions
=============================
acc_excep_id          number    --sequence (Primary key)
p_type                varchar2
t_type                varchar2
excep_attribute       varchar2  --contains column of default_accounts like A,B,C,D
priority              number
excep_base_sql        varchar2
excep_value           varchar2
===============================

Unique constraint: p_type, t_type, excep_attribute и priority foreign_key: p_type и t_type из Default_accounts

  acc_excep_id   p_type    t_type  excep_attribute priority  excep_base_sql   excep_value
---------------------------------------------------------------------------------------------
     1           apple    buy       A              1         --some--         XYZ
     2           apple    buy       A              2         --some--         PQR
     3           banana   sell      B              1         --some--         GHT
     4           banana   sell      B              2         --some--         GFF
     5           orange   sell      C              1         --some--         DSA    
---------------------------------------------------------------------------------------------

excep_base_sql: он содержит SQL-запрос наподобие select 1 from alloc where alloc_id =:alloc; - это пример запроса, но он всегда содержит привязку vairable: alloc

  1. Теперь мое требование заключается в том, чтобы у меня был курсор, содержащий записи, содержащие alloc_id ,p_type,t_type

  2. Я помещаю записи во временную таблицу, имеющую структуру, как показано ниже:

     alloc_id p_type  t_type  A   B    C   D
    ---------------------------------------------
     11       apple   buy    
     22       apple   sell
     33       mango   buy
     12       mango   buy
     13       mango   buy
     24       banana  buy
     54       orange  sell
    

    3. Но, как вы видите, мне нужно заполнить значения A, B, C и D оптом, временная таблица может содержать около millions of record.

    4.Для заполнения значения мне нужно сначала проверить таблицу account_exceptions на наличие каких-либо исключений. Например: я выбрал 11 apple buy из временной таблицы и вижу таблицу исключений. В таблице исключений найдите записи, имеющие p_type как apple и t t_type как buy по приоритету в порядке возрастания.

    5. Так, записи с acc_excep_id: 1,2 выбираются, я выбираю первую запись и запускаю excep_base_sql с alloc_id 11, если строка возвращается, тогда я обновлю excep_attribute A с XYZ во временной таблице и затем пропустить вторую запись с приоритетом 2, потому что запись с приоритетом один удовлетворяет.

    6.Если в таблице исключений нет записи apple buy, то мне нужно заполнить временную таблицу таблицей default_accounts, поэтому это значение равно Y.

    7. Так что, если исключение не удовлетворяет, значение по умолчанию выбирается из default_accounts.

    8. Короче говоря, мне нужно заполнить значение A B C D в таблице temp.

    9. Мне нужен способ эффективного заполнения данных во временной таблице для значения A B C D.

Может ли кто-нибудь помочь мне с этим подходом

1 Ответ

0 голосов
/ 13 мая 2012

Я собираюсь рекомендовать две вещи.

1) Вставка как выбор или создание таблицы как выбор всегда наиболее эффективна при массовой вставке.

2) Звучит так, будто вы пытаетесь преобразовать строки в столбцы. Я бы порекомендовал Oracle Pivot особенность. Сводная функция описана здесь: Oracle Base Pivot

...