2009-04-17 16 views
0

J'espère que quelqu'un pourra vous donner des conseils pour résoudre ce problème plus facilement. Je travaille sur la création d'une vue aplatie d'un ensemble de données hautement normalisé. Le but de l'aplatissement est de fournir une vue que les personnes normales peuvent utiliser pour développer des rapports. Les données source contient deux tables comme indiqué:Oracle: aplatissement des paires de valeurs de nom dans une table

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) 
) 

Le variable_id dans le tableau des valeurs d'enregistrement correspond à l'une des variables dans le flux d'entrée d'origine, par exemple une adresse ou un solde de compte. Pour un enregistrement d'entrée contenant 12 variables, il y aura douze lignes dans la table des valeurs d'enregistrement.

Les entrées du processus d'origine incluent des enregistrements de largeurs variables et de noms de variables. Ceux-ci sont divisés en tuples nom/valeur dans la table record_values. Je vous écris une procédure pour réassembler les variables de retour dans un enregistrement qui ressemble

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

Mon approche actuelle est de construire dynamiquement la table en trouvant les variables uniques pour l'ensemble donné de pistes (les détails ne sont pas importants ici), puis en créant une chaîne SQL qui va créer la table.

Mon défi est de savoir comment charger efficacement cette table de travail résultante à partir des données d'origine. Étant donné que les noms et le nombre des variables varie avec run_id, la seule façon que je peux penser à approcher c'est par quelque chose comme:

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 

Cela va courir pour toujours, comme les tables de parents ont 100 de millions de lignes

Est-ce que quelqu'un a une idée sur la façon de générer une approche que je peux utiliser pour faire une mise à jour par ligne de destination? De toute façon, n'importe qui peut sauter sur la conception des tables originales - il y avait des raisons professionnelles de le faire de cette façon. Je ne l'aime pas, mais il y avait de bonnes raisons de le faire.

Nous vous remercions de vos commentaires.

Andrew

Répondre

2

En Oracle 10g et au-dessus:

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

Essayé cela, il ne semble pas que nous avons les composants OLAP installés. –

+0

Cela fait partie de chaque installation Oracle 10g (y compris XE gratuit). Êtes-vous sûr de faire un 10g? – Quassnoi