[gelöst] Umfangreiche Abfrage stürzt ab

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

[gelöst] Umfangreiche Abfrage stürzt ab

Beitrag von Jott »

Hallo Leute,

habe mal wieder ein Problem mit meiner DB:

Bei der Ausführung dieser Abfrage:

Code: Alles auswählen

Sql = "SELECT (""Ort"".""Nummer"" || ' - ' || ""Ort"".""Name"") AS RAUM, ""Produkt"".""Name"" AS PRODUKT, ""Stoff"".""Name"" AS STOFF, ""Stoff"".""EWG"", ""Stoff"".""CAS"", ""Lieferant"".""Name"" AS HERSTELLER, ""Produkt"".""Partikelgröße"" AS PARTIKELGROESSE, ""PartEinheit"".""Name"" AS PEINHEIT, ""ProduktOrtMenge"".""Schrank"" AS SCHRANK, ""ProduktOrtMenge"".""Fach"" AS FACH, ""ProduktOrtMenge"".""Menge"" AS MENGE, ""Einheit"".""Name"" AS MEINHEIT, HTEMP.SATZ, PTEMP.SATZ, EUHTEMP.SATZ, GKLTEMP.SATZ 
FROM HTEMP, PTEMP, EUHTEMP, GKLTEMP, ""ProduktOrtMenge"", ""Ort"", ""Produkt"", ""Lieferant"", ""Stoff"", ""PartEinheit"", ""Einheit"" 
WHERE ""ProduktOrtMenge"".""OrtID"" = ""Ort"".""ID"" AND ""ProduktOrtMenge"".""ProduktID"" = ""Produkt"".""ID"" AND ""Produkt"".""LieferantID"" = ""Lieferant"".""ID"" AND ""Produkt"".""StoffID"" = ""Stoff"".""ID"" AND ""Produkt"".""PartEinheitID"" = ""PartEinheit"".""ID"" AND ""ProduktOrtMenge"".""EinheitID"" = ""Einheit"".""ID"" AND HTEMP.STOFFID=""Stoff"".""ID"" AND PTEMP.STOFFID=""Stoff"".""ID"" AND EUHTEMP.STOFFID=""Stoff"".""ID"" AND GKLTEMP.STOFFID=""Stoff"".""ID"""
Hängt sich Base ohne Fehlermeldung einfach auf.

Wenn ich die Abfrage so vereinfache (3 Tabellen rausgenommen):

Code: Alles auswählen

Sql = "SELECT (""Ort"".""Nummer"" || ' - ' || ""Ort"".""Name"") AS RAUM, ""Produkt"".""Name"" AS PRODUKT, ""Stoff"".""Name"" AS STOFF, ""Stoff"".""EWG"", ""Stoff"".""CAS"", ""Lieferant"".""Name"" AS HERSTELLER, ""Produkt"".""Partikelgröße"" AS PARTIKELGROESSE, ""PartEinheit"".""Name"" AS PEINHEIT, ""ProduktOrtMenge"".""Schrank"" AS SCHRANK, ""ProduktOrtMenge"".""Fach"" AS FACH, ""ProduktOrtMenge"".""Menge"" AS MENGE, ""Einheit"".""Name"" AS MEINHEIT, HTEMP.SATZ 
FROM HTEMP, ""ProduktOrtMenge"", ""Ort"", ""Produkt"", ""Lieferant"", ""Stoff"", ""PartEinheit"", ""Einheit"" 
WHERE ""ProduktOrtMenge"".""OrtID"" = ""Ort"".""ID"" AND ""ProduktOrtMenge"".""ProduktID"" = ""Produkt"".""ID"" AND ""Produkt"".""LieferantID"" = ""Lieferant"".""ID"" AND ""Produkt"".""StoffID"" = ""Stoff"".""ID"" AND ""Produkt"".""PartEinheitID"" = ""PartEinheit"".""ID"" AND ""ProduktOrtMenge"".""EinheitID"" = ""Einheit"".""ID"" AND HTEMP.STOFFID=""Stoff"".""ID"""
funktioniert es. Ich gehe also mal davon aus, dass mein Programmcode korrekt ist.

Habt ihr ne Idee was man da machen kann? Ich habe es schon damit versucht, den Arbeitsspeicher für OOo in den Optionen heraufzusetzen (auf 64MB/16MB pro Objekt), das hat aber nicht geholfen.
Könnte es an meinem System liegen (habe die nächsten Tage leider kein anderes zum Testen)?

Daten:
  • OOo 3.3 auf Windos XP SP3
    Nutzung der internen HSQL-Engine
    1,2 GHz-Rechner mit 1 GB RAM
    ca. 150 Datensätze als Abfrageergebnis
EDIT:
Hier ein Link zu meiner Tabellenstruktur, sonst kapiert man ja nix:
http://img852.imageshack.us/i/tabellen.jpg/

Die Tabellen HTEMP, EUHTEMP, PTEMP, GKLTEMP tauchen darin nicht auf, weil sie per Makro erstellt sind, um die m:n-Beziehungen übersichtlicher zu gestalten. Sie haben alle die folgende Struktur:
STOFFID | STOFF | SATZ

Will heißen die Tabelle HTEMP sieht gefüllt dann z.B. so aus:
7 | Ethanol | H325, H201
12 | Propanol | H325, H123, H124
usw.
(H-Sätze sind hier jetzt mal fiktiv :lol: )
Zuletzt geändert von Jott am Mo, 07.03.2011 12:04, insgesamt 1-mal geändert.
AndreasJBittner
*****
Beiträge: 473
Registriert: Fr, 09.10.2009 16:44
Wohnort: Bielefeld
Kontaktdaten:

Re: Umfangreiche Abfrage stürzt ab

Beitrag von AndreasJBittner »

Hallo Jott,

ich habe mal versucht, Deine Abfrage etwas übersichtlicher zu gestalten und meine Anmerkungen/Fragen hinter das # in der betreffenden Zeile geschrieben:

Code: Alles auswählen

SELECT (
""Ort"".""Nummer"" || ' - ' || ""Ort"".""Name"") AS RAUM, 
""Produkt"".""Name"" AS PRODUKT, 
""Stoff"".""Name"" AS STOFF, 
""Stoff"".""EWG"", 
""Stoff"".""CAS"", 
""Lieferant"".""Name"" AS HERSTELLER, 
""Produkt"".""Partikelgröße"" AS PARTIKELGROESSE, 
""PartEinheit"".""Name"" AS PEINHEIT, 
""ProduktOrtMenge"".""Schrank"" AS SCHRANK, 
""ProduktOrtMenge"".""Fach"" AS FACH, 
""ProduktOrtMenge"".""Menge"" AS MENGE, 
""Einheit"".""Name"" AS MEINHEIT, 
HTEMP.SATZ, # AS H_SATZ?
PTEMP.SATZ, # dito
EUHTEMP.SATZ, # dito
GKLTEMP.SATZ # dito

FROM 

HTEMP, PTEMP, EUHTEMP, GKLTEMP, ""ProduktOrtMenge"", ""Ort"", ""Produkt"", ""Lieferant"", ""Stoff"", ""PartEinheit"", ""Einheit"" 

WHERE 
""ProduktOrtMenge"".""OrtID"" = ""Ort"".""ID"" AND 
""ProduktOrtMenge"".""ProduktID"" = ""Produkt"".""ID"" AND 
""Produkt"".""LieferantID"" = ""Lieferant"".""ID"" AND 
""Produkt"".""StoffID"" = ""Stoff"".""ID"" AND 
""Produkt"".""PartEinheitID"" = ""PartEinheit"".""ID"" AND 
""ProduktOrtMenge"".""EinheitID"" = ""Einheit"".""ID"" AND 
HTEMP.STOFFID=""Stoff"".""ID"" AND 
PTEMP.STOFFID=""Stoff"".""ID"" AND 
EUHTEMP.STOFFID=""Stoff"".""ID"" AND 
GKLTEMP.STOFFID=""Stoff"".""ID"""
;  # kein `;´am Ende - nicht nötig?
Du sagst, Deine xTEMP-Tabellen sehen alle gleich aus, vielleicht stolpert OOo-Base darüber, daß da das gleiche drin steht. Gibts die xTEMP-Tabellen denn alle zum Abfragezeitpunkt? Hast Du mal versucht, Deine Abfrage etwas zu teilen und auf die Einzelabfragen eine UNION-Abfrage draufzusetzen? Auf den ersten Blick sieht das aus, als hättest Du Dich mit REACH oder CLP/GHS angesteckt. :-D

Grüße
Andreas
LO 4.3
AMD Athlon 64 3700+, 2.21 GHz, 4 GB RAM, Win XP SP3
iMac 2 GHz, 16 GB RAM/MacBookPro, 8 GB RAM, Mac OS X 10.9.5
Intel Core2 Quad CPU Q6600 @ 2,4 GHz, 4 GB RAM, Suse 13.2

MySQL 5.1: Pentium III, 666 MHz, 512 MB, Suse 12.1
Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

Re: Umfangreiche Abfrage stürzt ab

Beitrag von Jott »

Hey Andreas,

ja, habe mich mit GHS angesteckt :lol:

Also die xTEMP Tabellen gibt es schonmal alle. Es steht nicht das gleiche drin, die Spalten haben nur die gleichen Namen (meintest du ja wahrscheinlich auch). Hinter die Abfrage von "SATZ" jeweils nochmal ein AS... zu setzen werd ich also auf jeden Fall morgen ausprobieren. Die Idee mit UNION auch. Hab den Thread dazu grad gefunden.

; ist in StarBasic nicht nötig, habe ich auch bei keiner meiner anderen Abfragen eingebaut (und das sind viele).

Vielen Dank schonmal und schönen Abend, ich berichte dann.
Jott
Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

Re: Umfangreiche Abfrage stürzt ab

Beitrag von Jott »

Hey Andreas,

ich habe jetz noch etwas rumprobiert:
- Das Einfügen von AS... hat leider keine Besserung gebracht. Mache ich jetzt aber so, weil es sauberer ist.
- In Bezug auf UNION stehe ich etwas auf dem Schlauch. Ich habe mir mal die Definition des Befehles angeguckt und dabei festgestellt, dass UNION vertikales Zusammenfügen von Tabellen bedeutet. Das heißt doch, dass die beiden Teile die gleiche Spaltenanzahl haben müssen. Ich sehe aber nicht, wie ich meine Abfrage dahingegeend aufteilen soll. Kannst du mir ein Beispiel geben?
- Dachte dann, ich probiere mal einen JOIN aus. Den habe ich aber noch nie programmiert. Habe im Netz die Syntax rausgesucht und mal eine reduzierte Version direkt über die Base Abfrageerstellung ausprobiert:

Code: Alles auswählen

SELECT "Stoff"."Name" AS "STOFF"
FROM "Stoff" 
INNER JOIN "HTEMP" 
ON "Stoff"."ID"="HTEMP"."STOFFID"
Das gibt zwar keinen Fehler, aber als Ergebnis bekomme ich nur STOFF aus Stoff. Der JOIN wird quasi missachtet. Was funktioniert ist folgendes:

Code: Alles auswählen

SELECT * FROM "Stoff" 
INNER JOIN "HTEMP" 
ON "Stoff"."ID"="HTEMP"."STOFFID"
Aber eigentlich brauche ich ja gar nicht alle Spalten...
AndreasJBittner
*****
Beiträge: 473
Registriert: Fr, 09.10.2009 16:44
Wohnort: Bielefeld
Kontaktdaten:

Re: Umfangreiche Abfrage stürzt ab

Beitrag von AndreasJBittner »

Hi Jott,

das union ist nicht so schwer.

Code: Alles auswählen

SELECT Vorname, Name, Alter FROM Verwandte
UNION
SELECT Vorname, Name, Alter FROM Bekannte
Beide Tabellen oder zumindest Abfragen müssen die gleichen Variablen haben und -- soweit ich weiß -- die gleiche Breite. Aber andernfalls würde es auch keinen Sinn haben, die daten durch zusammenführen zu mischen.
Deine Abfrage ist aber so komplex, daß ich die nicht auf einen Blick überschaue. Und ich weiß halt nicht, *was* in Deinen Tabellen steht und warum Du unbedingt -- und dann auch gleich drei! -- temporäre Tabellen brauchst. Kann es sein, daß die Abfrage so "wirr" (sorry) ist, weil Dein Tabellen-/DB-Design verbessert werden könnte?
GHS etc. kommt auch auf mich zu, die DB könnten wir beide gebrauchen. Vielleicht sollten wir mal von vorne anfangen.

Grüße
Andreas
LO 4.3
AMD Athlon 64 3700+, 2.21 GHz, 4 GB RAM, Win XP SP3
iMac 2 GHz, 16 GB RAM/MacBookPro, 8 GB RAM, Mac OS X 10.9.5
Intel Core2 Quad CPU Q6600 @ 2,4 GHz, 4 GB RAM, Suse 13.2

MySQL 5.1: Pentium III, 666 MHz, 512 MB, Suse 12.1
Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

Re: Umfangreiche Abfrage stürzt ab

Beitrag von Jott »

Hey Andreas,

nee, dann kann ich mit UNION da wirklich nichts anfangen ;-)

Wegen des Tabellendesigns: Das habe ich ja im ersten Posting verlinkt. Also ich bin mir da keiner Schlamperei bewusst. Denke, dass sollte so perfekt normalisiert sein. Wenn du da trotzdem einen Fehler siehst, schieß los.

Warum ich die temporären Tabellen brauche (es sind sogar vier): Jedem Stoff können ja quasi beliebig viele H-, EUH-, P-Sätze und Gefahrenklassen zugeordnet werden. Das heißt, wenn man jetzt z.B. nur alle Stoffe und ihre H-Sätze abfragt, dann kriegt man schon so eine Tabelle:
Ethanol | H325
Ethanol | H201
Propanol | H325
Propanol | H123
Propanol | H124
usw.

Kommen jetzt noch die anderen Sätze dazu, wird es sehr unübersichtlich. Und ich brauche schließlich am Ende einen Bericht, in dem für hunderte Stoffe diese Zuordnungen übersichtlich aufgeführt sind. Daher habe ich ein Makro gebastelt, das mir jeweils die H-, EUH-, P-Sätze und Gefahrenklassen eines Stoffes in eine Zeile schreibt. Temporäre Tabellen braucht man dazu sicherlich nicht zwingend, ich finde aber, dass das eine relativ übersichtliche (und leicht zu programmierende) Lösung ist. Die Berichterstellung wird dann auch kinderleicht.

Ich bin inzwischen mit JOIN auch weiter, werde damit nochmal losprobieren und sage Bescheid wie es lief.

Gruß,
Jott
Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

Re: Umfangreiche Abfrage stürzt ab

Beitrag von Jott »

Sooooo, habs geschafft :mrgreen:

Mit dem JOIN bin ich zwar nicht wirklich zu Rande gekommen, aber das Stichwort "vier temporäre Tabellen" hat mir zu denken gegeben. Ich habe jetzt einfach vor dem Durchführen der "großen" Abfrage meine vier Tabellen zu einer einzigen Tabelle "TEMPZUSAMMEN" vereinigt:

Code: Alles auswählen

  Sql = "DROP TABLE TEMPZUSAMMEN"
  SQL_Anweisung.executeUpdate(Sql)
  
  Sql = "CREATE TABLE TEMPZUSAMMEN " & _
         "(STOFFID integer NOT NULL, H varchar(500) NOT NULL, P varchar(500) NOT NULL, " & _
         "EUH varchar(500) NOT NULL, GKL varchar(500) NOT NULL, " & _
         "PRIMARY KEY(STOFFID))"
  SQL_Anweisung.executeUpdate(Sql) 
  
  SQL_Anweisung.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_INSENSITIVE
  Sql = "SELECT HTEMP.STOFFID, " & _
                      "HTEMP.SATZ AS H, " & _
                      "PTEMP.SATZ AS P, " & _
                      "EUHTEMP.SATZ AS EUH, " & _
                      "GKLTEMP.SATZ AS GKL " & _
         "FROM HTEMP, PTEMP, EUHTEMP, GKLTEMP " & _
         "WHERE HTEMP.STOFFID=PTEMP.STOFFID " & _
                      "AND HTEMP.STOFFID=EUHTEMP.STOFFID " & _
                      "AND HTEMP.STOFFID=GKLTEMP.STOFFID"
  ResultSet = SQL_Anweisung.executeQuery(Sql)
(Die Schleife zum Füllen der Tabelle mit dem Abfrageergebnis spar ich mir jetzt mal)

Aus dieser Tabelle lassen sich jetzt die Sätze mit abfragen.

Irgendwie ein total umständliches Workaround - warum das nun nötig ist versteh ich nicht wirklich, aber Hauptsache es läuft :mrgreen:
Antworten