2009-04-17 3 views
0

Я надеюсь, что кто-то может предоставить некоторые рекомендации для более легкого способа решения этой проблемы. Я работаю над созданием сглаженного представления высоко нормированного набора данных. Целью сглаживания является представление, которое обычные люди могут использовать для разработки отчетов. Источник данных содержит несколько таблиц, как показано ниже:Oracle: выравнивание пар значений имени в таблице

CREATE TABLE VARIABLES ( 
    VARIABLE_ID INT NOT NULL IDENTITY, 

    VARIABLE_NAME VARCHAR(100) NOT NULL, 

    VARIABLE_DATATYPE VARCHAR(100) NOT NULL, 

    PRIMARY KEY (VARIABLE_ID), 

    UNIQUE (VARIABLE_NAME,VARIABLE_DATATYPE) 
) 

CREATE TABLE RECORD_VALUES (
    RUN_ID INT NOT NULL REFERENCES RUNS (RUN_ID) ON DELETE CASCADE, 

    VARIABLE_ID INT NOT NULL REFERENCES VARIABLES(VARIABLE_ID) ON DELETE CASCADE, 

    RECORD_ID VARCHAR(100) NOT NULL, 

    VARIABLE_VALUE VARCHAR(1000), 

    PRIMARY KEY (RUN_ID,VARIABLE_ID,RECORD_ID) 
) 

variable_id в таблице значений записей соответствует одной из переменных в исходном входном потоке, скажем, адрес или баланс счета. Для входной записи, содержащей 12 переменных, в таблице значений записей будет 12 строк.

Входы в исходный процесс включают записи различной ширины и имена переменных. Они разбиваются на кортежи имен/значений в таблице record_values. Я пишу процедуру, чтобы собрать переменные обратно в запись, которая выглядит как

run_id 
record_id (which is actually an underlying account number) 
variable_value_1 
variable_value_2 
... 
variable_value_n 

Мой текущий подход для динамического построения таблицы, находя уникальные переменные для заданного набора трасс (подробности здесь не важно), а затем построение строки SQL, которая создаст таблицу.

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

create a cursor for the list of variables 
for each variable in the list 
    create a cursor to find all the record values for that variable 
    for each record value 
     update the appropriate record/column in the work table 
    end 
end 

Это будет работать вечно, как родительские таблицы имеют 100-х миллионов строк.

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

Чтобы никто не вскакивал с дизайном оригинальных таблиц, были деловые причины для этого. Мне это не нравится, но для этого были веские причины.

Спасибо за любые мысли, которые вы можете предоставить.

Эндрю

ответ

2

В Oracle 10g и выше:

SELECT DISTINCT run_id, record_id, val1, val2, ..., val12 
FROM record_values 
MODEL 
IGNORE NAV 
PARTITION BY 
     (run_id, record_id) 
DIMENSION BY 
     (variable_id) 
MEASURES 
     (val, 0 AS val1, 0 AS val2, ..., 0 AS val12) 
RULES UPDATE 
     (
     val1[ANY] = val[1], /* Put real variable ID's in the square brackets */ 
     val2[ANY] = val[2], 
     ..., 
     val12[ANY] = val[12] 
     ) 
+0

Пробовал это, она не выглядит, как у нас компоненты OLAP установлены. – 2009-04-17 15:58:41

+0

Это часть каждой установки Oracle 10g (включая бесплатный XE). Вы уверены, что используете 10g? – Quassnoi

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