0

我希望有人可以提供一些建议,以更轻松地解决此问题。我正在努力为一组高度规范化的数据创建一个平面视图。扁平化的目标是提供一个普通人可以用来开发报告的视图。源数据包含几个表,如下所示:

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 的数百万行。

有没有人知道如何生成一种我可以用来对每个目标行进行一次更新的方法?

以免有人跳上原始表格的设计——这样做是有商业原因的。我不喜欢它,但这样做是有充分理由的。

感谢您提供的任何想法。

安德鲁

4

1 回答 1

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]
        )
于 2009-04-17T14:29:01.043 回答