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
Essayé cela, il ne semble pas que nous avons les composants OLAP installés. –
Cela fait partie de chaque installation Oracle 10g (y compris XE gratuit). Êtes-vous sûr de faire un 10g? – Quassnoi