2009-04-17 4 views
0

Ich hoffe, jemand kann einige Ratschläge für eine einfachere Möglichkeit, um mit diesem Problem umzugehen. Ich arbeite daran, eine geglättete Ansicht eines hoch normalisierten Datensatzes zu erstellen. Das Ziel der Abflachung besteht darin, eine Ansicht bereitzustellen, aus der normale Personen Berichte erstellen können. Die Quelldaten enthält ein paar Tabellen gezeigt:Oracle: Verflachung Namen Wert Paare in eine Tabelle

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

Die variable_id in der Tabelle Rekordwerte entspricht einer der Variablen in der ursprünglichen Eingangsstrom, sagen eine Adresse oder einen Kontostand. Für einen Eingabedatensatz, der 12 Variablen enthält, gibt es zwölf Zeilen in der Tabelle der Datensatzwerte.

Die Eingaben für den ursprünglichen Prozess umfassen Datensätze mit unterschiedlichen Breiten und Variablennamen. Diese sind in Name/Wert-Tupel in der record_values-Tabelle aufgeteilt. Ich schreibe ein Verfahren, um die Variablen wieder zusammenbauen wieder in einen Datensatz, wie

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

Mein aktueller Ansatz sieht dynamisch ist, um die Tabelle zu erstellen, indem Sie die einzigartigen Variablen für den gegebenen Satz von Durchläufen zu finden (Details hier nicht wichtig), und dann eine SQL-Zeichenfolge erstellen, die die Tabelle erstellt.

Meine Herausforderung besteht darin, diese resultierende Arbeitstabelle effizient aus den Originaldaten zu laden. Da die Namen und die Anzahl der Variablen mit RUN_ID variiert, ist die einzige Art, wie ich denken kann, um diesen Ansatz ist durch so etwas wie:

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 

Das wird für immer laufen, da die übergeordneten Tabellen habe 100 Millionen Reihen.

Hat jemand eine Idee darüber, wie man einen Ansatz generiert, mit dem ich ein Update pro Zielzeile durchführen kann?

Damit niemand auf das Design der ursprünglichen Tabellen springt - es gab geschäftliche Gründe, dies auf diese Weise zu tun. Ich mag es nicht, aber es gab gute Gründe dafür.

Vielen Dank für Ihre Gedanken.

Andrew

Antwort

2

In Oracle 10g und oben:

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

dies versucht, es sieht nicht wie wir die OLAP-Komponenten installiert haben. –

+0

Es ist ein Teil jeder Oracle 10g-Installation (einschließlich kostenloser XE). Sind Sie sicher, dass Sie eine 10g laufen? – Quassnoi