Oracle: объединение пар имя-значение в таблицу - PullRequest
0 голосов
/ 17 апреля 2009

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

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 переменных, в таблице значений записи будет двенадцать строк.

Входные данные для исходного процесса включают записи различной ширины и имена переменных. Они разбиты на кортежи имя / значение в таблице 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

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

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

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

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

Andrew

1 Ответ

2 голосов
/ 17 апреля 2009

В 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]
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...