Viele Abfragen bei denen nur eine Spalte unterschiedlich ist

00d4vid

Mitglied
Ich weißt nicht, ob der Titel aussagekräftig ist aber ich suche nach einer Lösung für folgendes Problem:
Ich habe ein Programm, das aus Datenbankabfragen eine Excel-Datei generiert.
Jede Excel-Datei hat ca.30.000 Einträge, die in der Datenbank stehen, jeder Eintrag 20 Spalten.
Nun sind allerdings von den 20 Spalten bei jeder Abfrage 19 gleich, die 20. wird über eine relativ komplizierte SQL-Abfrage selektiert.
Weiteres Problem ist, dass nicht jede Excel-Datei alle 30.000 Einträge enthalten soll. D.h. es kommt vor, dass wenn in Spalte 20 kein Eintrag gefunden wird, alle anderen 19, die dazu passen raus fallen (Ist im Select ein Left Outer Join).
Ist es irgendwie möglich, dass ich mir die ersten 19 Spalten immer im Speicher halte und die 20. dazu "joine" praktisch oder ist es vermutlich eher schneller, jedes mal alle Daten aus der DB abzufragen?

Ich hatte an irgendsowas gedacht wie zwei HashMaps. Die erste Map enthält alle Keys, die zweite Map alle oder weniger Keys. Und dann zur zweiten Map mit der Untermenge die passenden 19 Spalten aus der ersten dazu-joinen/mappen, wie auch immer man es nennen will?

Geht sowas oder habt ihr eine andere Idee?
 
Also wenn diese 19 immer gleich sind, würd ich zuerst mal die 19 abfragen.
Diese dann wo speichern (eg. HashMap)

Und dann das 'komplizierte' Statement ausführen.

Dann nur noch für jede Zeile ins Excel schreiben, oder hab ich da was falsch verstanden?

greez
THEJS
 
Grundsätzlich ja.
Mein Problem ist nur, dass eben in Liste 1 Elemente sind, die in Liste 2 unter Umständen nicht auftauchen und in der Excel dann zwischen Zeilen wiederum Info-Zeilen auftauchen.
Im Moment hole ich mir alle Werte mit dem richtigen Select und iteriere einfach drüber und anhand von bestimmten Kriterien werden zwischendrin wieder Zeilen eingefügt.
Was ich bräuchte wäre praktisch sowas in der Art
Java:
HashMap<String, 19Values> map1 = new HashMap<String, 19Values>();
map1.put("1", new 19Values(value1, value2, value3 ...);
map1.put("2", new 19Values(value1, value2, value3 ...);
map1.put("3", new 19Values(value1, value2, value3 ...);
map1.put("4", new 19Values(value1, value2, value3 ...);
map1.put("5", new 19Values(value1, value2, value3 ...);
map1.put("6", new 19Values(value1, value2, value3 ...);

HashMap<String, double> map2 = new HashMap<String, double>();
map2.put("1", 1.2);
map2.put("2", 0.9);
map2.put("3", 0.5);

//join map1 with map2

Am Ende möchte ich dann eine Map haben, in der alle Werte von map2 mit den zugehörigen Werten aus map1 auftauchen.
Also so ca.
Java:
HashMap<String, double> map3 = new HashMap<String, double>();
map3.put("1", new 20Values(19Values, double);
map3.put("2", new 20Values(19Values, double);
map3.put("3", new 20Values(19Values, double);
 
Hm... So ganz verstehen tue ich das noch nicht... Ich hoffe, ich hab so einigermaßen durchschaut, was dein Problem ist :)

Bau dir deine Join Methode doch selbst.

In beiden Maps stehen doch die gleichen Keys drin?

Ich habe nicht genau verstanden, wie deine Datenstruktur mit den HashMaps nun aussieht, aber scheinbar hast du eine HashMap<String, Irgendwas>. Ich nehme jetzt mal an, dass das Irgendwas das Interface List implementiert.

Dann kannst du doch einfach das letzte fehlende (20. ? ) Objekt nachträglich dieser Liste hinzufügen?!

Java:
Map<String, Irgnedwas> result = new Map<String, Irgendwas>();
for (String key : map2.keySet()) {
result.put(key, map1.get(key).add(map3.get(key)));
}

Achtung: Code ist direkt im Browser getippt und wohl eher als Ansatz zu verstehen als als vollfunktionsfähioge Lösung...

Edit: Ich verstehe aber noch nicht ganz, wozu die Map map gut ist, wenn sich doch bei jedem Eintrag nur der Key, nicht aber das Value-Objekt ändert... Reicht dann nicht eine einzige Liste, in der du das Ergebnis speicherst?
 
Zuletzt bearbeitet:
Jetzt hab ich verstanden was du meinst :)
So könnte es durchaus funktionieren, ich muss mal probieren was schneller ist.
Mein eigentliches Problem ist, dass die Datenbank, aus der ich das Abfrage eine Dynamics NAV DB ist und die in der Version keine Fremdschlüssel hat...
D.h. die Abfragen sind nicht unbedingt performant und ich möchte jetzt probieren, ob es nicht evtl deutlich schneller geht, wenn ich am Anfang alle Daten in eine große HashMap lade und für jede Generierung diese HashMap kopiere, die Spalte 20 aus der DB abfrage, die Map mit Spalte 20 mit der Map mit allen Daten joine.
Also dass die Abfragen schneller gehen, denn die Spalte 20 bekomme ich aus einer DB-Tabelle raus, die gesamten Daten nicht.

Danke schonmal, ich werde es am Freitag mal testen und mich dann nochmal melden :)
 
Zurück