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