Probleme mit Parameterabfrage
Moderator: Moderatoren
-
- **
- Beiträge: 20
- Registriert: Mo, 25.10.2010 18:31
Probleme mit Parameterabfrage
Hallo!
Ich habe eine Abfrage über "Abfrage in SQL-Ansicht erstellen" erstellt. Darin frage ich mit ":geschlecht" ein Parameter ab. Diese Parameterabfrage funktioniert jedoch nicht bei eingeschaltetem Modus "SQL-Kommando direkt ausführen". Abschalten kann ich diesen Modus jedoch nicht. Dann weigert sich Base, diese Abfrage zu speichern und bricht mit "Syntax Error in SQL-Expression" ab.
Wie führe ich jetzt diese Abfrage im "Normal/Base"-Modus aus, so dass auch das/der(?) Parameter abgefragt wird?
Ich habe eine Abfrage über "Abfrage in SQL-Ansicht erstellen" erstellt. Darin frage ich mit ":geschlecht" ein Parameter ab. Diese Parameterabfrage funktioniert jedoch nicht bei eingeschaltetem Modus "SQL-Kommando direkt ausführen". Abschalten kann ich diesen Modus jedoch nicht. Dann weigert sich Base, diese Abfrage zu speichern und bricht mit "Syntax Error in SQL-Expression" ab.
Wie führe ich jetzt diese Abfrage im "Normal/Base"-Modus aus, so dass auch das/der(?) Parameter abgefragt wird?
Gruss Neujuenger2010
OOo 3.2.1 auf Vista
OOo 3.2.1 auf Vista
Re: Probleme mit Parameterabfrage
Aloha
Um was für eine Abfrage handelt es sich denn?
Die Parameterabfrage funktioniert nicht mit eingeschaltetem "SQL-Kommando direkt ausführen", da sie von Base interpretiert und nur deshalb abgefragt wird, mit aktivierter Option umgehst Du aber genau das.
Du hast nun folgende Optionen:
a) Du ersetzt alle Sachen, die das direkte Ausführen des SQL-Kommandos benötigen, durch solche, die dies nicht tun (JOINS durch Unterabfragen z.B.)
b) Du erstellst eine Ansicht (View) aus Deiner Abrage (mit direkt ausgeführtem SQL) und machst auf diese wiederum Deine Parameterabfrage
Um was für eine Abfrage handelt es sich denn?
Die Parameterabfrage funktioniert nicht mit eingeschaltetem "SQL-Kommando direkt ausführen", da sie von Base interpretiert und nur deshalb abgefragt wird, mit aktivierter Option umgehst Du aber genau das.
Du hast nun folgende Optionen:
a) Du ersetzt alle Sachen, die das direkte Ausführen des SQL-Kommandos benötigen, durch solche, die dies nicht tun (JOINS durch Unterabfragen z.B.)
b) Du erstellst eine Ansicht (View) aus Deiner Abrage (mit direkt ausgeführtem SQL) und machst auf diese wiederum Deine Parameterabfrage
-
- **
- Beiträge: 20
- Registriert: Mo, 25.10.2010 18:31
Re: Probleme mit Parameterabfrage
Hallo!
Es ist die Abfrage aus dem "Einkaufsthread".
Halt mit dem Versuch, diese benutzerfreundlich zu modifizieren:
Mein Versuch war, 'männlich' in der letzten Zeile durch :Geschlecht zu ersetzen.
Ich hab dann mal versucht, Deine Lösung zu modifizieren - mit dem gleichen Ergebnis (SQL-Modus erforderlich).
Hast Du einen Tipp wo/wie genau ich an meiner (und/oder Deiner) Lösung schrauben muss?
Danke im voraus!
Es ist die Abfrage aus dem "Einkaufsthread".
Halt mit dem Versuch, diese benutzerfreundlich zu modifizieren:
Code: Alles auswählen
Select
"Einkauf"."Name",
"Einkauf"."Einkaufsdatum",
"Einkauf"."Einkauf"
From
"Einkauf"
join
(SELECT "Einkauf"."Name", Max("Einkauf"."Einkaufsdatum") as LetzterEinkauf
FROM "Einkauf"
GROUP BY "Einkauf"."Name" )
on "Einkauf"."Einkaufsdatum" = LetzterEinkauf
join "Kundendaten" on "Kundendaten"."Name" = "Einkauf"."Name"
where "Kundendaten"."Aktiv" = true and "Kundendaten"."Geschlecht" = 'männlich'
Ich hab dann mal versucht, Deine Lösung zu modifizieren - mit dem gleichen Ergebnis (SQL-Modus erforderlich).
Hast Du einen Tipp wo/wie genau ich an meiner (und/oder Deiner) Lösung schrauben muss?
Danke im voraus!
Gruss Neujuenger2010
OOo 3.2.1 auf Vista
OOo 3.2.1 auf Vista
Re: Probleme mit Parameterabfrage
Aloha
In Deinem Lösungsvorschlag wiederum ist das JOIN im Weg - Base versteht keine JOINS (sigh), diese funktionieren nur, wenn Base das parsen direkt der HSQLDB überlässt.
Die folgende Abfrage sollte das tun, was Dir vorschwebt (als Parametereingabe reicht ein "m" für "männlich" bzw "w" für "weiblich")
Das Problem in meinem Lösungsvorschlag ist lediglich der Kommentar - Base kann Kommentare nicht als solche interpretieren und spuckt deshalb die Fehlermeldung aus (sigh).Neujuenger2010 hat geschrieben:Ich hab dann mal versucht, Deine Lösung zu modifizieren - mit dem gleichen Ergebnis (SQL-Modus erforderlich).
In Deinem Lösungsvorschlag wiederum ist das JOIN im Weg - Base versteht keine JOINS (sigh), diese funktionieren nur, wenn Base das parsen direkt der HSQLDB überlässt.
Die folgende Abfrage sollte das tun, was Dir vorschwebt (als Parametereingabe reicht ein "m" für "männlich" bzw "w" für "weiblich")
Code: Alles auswählen
SELECT
"a"."Name",
"a"."Einkaufsdatum",
"a"."Einkauf"
FROM
"Einkauf" "a", "Kundendaten"
WHERE
"a"."Name" = "Kundendaten"."Name"
AND "Kundendaten"."Aktiv" = TRUE
AND "a"."Einkaufsdatum" = (SELECT MAX("Einkaufsdatum") FROM "Einkauf" WHERE "a"."Name" = "Name")
AND LOWER("Kundendaten"."Geschlecht") LIKE LOWER(:Geschlecht || '%')
ORDER BY
"Einkaufsdatum" DESC
-
- **
- Beiträge: 20
- Registriert: Mo, 25.10.2010 18:31
Re: Probleme mit Parameterabfrage
Hallo!
O.K., das funktioniert perfekt!
Jetzt möchte ich nur noch verstehen, warum...
1. Frage
Was genau bewirkt
und warum tust Du das? Wird hier die Tabelle "Einkauf" quasi dupliziert und die Dublette als "a" bezeichnet?
2. Frage
Warum greifst Du dann in
auf die Dublette zu?
3. Frage
Was bewirkt
?
Offenbar das gleiche, wie bei mir der JOIN - eine Ermittlung des Max-Datums bei gleichzeitiger Aggregation nach Kundenname.
Aber wieso steht das letzte "Name" in der Zeile "alleine" - ohne eine vorangehende "xyz". -Tabellenbezeichnung?
Ich bin grad etwas verwirrt.
Für etwas Nachhilfe wäre ich dankbar!
O.K., das funktioniert perfekt!
Jetzt möchte ich nur noch verstehen, warum...

1. Frage
Was genau bewirkt
Code: Alles auswählen
"Einkauf" "a",
2. Frage
Warum greifst Du dann in
Code: Alles auswählen
"a"."Name",
"a"."Einkaufsdatum",
"a"."Einkauf"
[....]
"a"."Name" = "Kundendaten"."Name"
[....]
AND "a"."Einkaufsdatum" = (SELECT MAX("Einkaufsdatum") FROM "Einkauf" WHERE "a"."Name" = "Name")
3. Frage
Was bewirkt
Code: Alles auswählen
AND "a"."Einkaufsdatum" = (SELECT MAX("Einkaufsdatum") FROM "Einkauf" WHERE "a"."Name" = "Name")
Offenbar das gleiche, wie bei mir der JOIN - eine Ermittlung des Max-Datums bei gleichzeitiger Aggregation nach Kundenname.
Aber wieso steht das letzte "Name" in der Zeile "alleine" - ohne eine vorangehende "xyz". -Tabellenbezeichnung?
Ich bin grad etwas verwirrt.
Für etwas Nachhilfe wäre ich dankbar!
Gruss Neujuenger2010
OOo 3.2.1 auf Vista
OOo 3.2.1 auf Vista
Re: Probleme mit Parameterabfrage
Aloha
1.)
Ich vergebe also lediglich einen Alias für die Tabelle "Einkauf", so wie man es auch bei Spalten machen kann
Für Zugriffe auf die Tabelle kann ich von da an das vergebene Alias verwenden. Bei "Einkauf" vielleicht erstmal nicht so wirklich beeindruckend, aber wenn man desöfteren mit Datenbanken arbeitet (vor allem solchen, die man nicht selber entworfen hat), kann es vorkommen, dass eine Tabellenname 20 oder mehr Zeichen hat - das ist nervig zu schreiben und auch nicht sonderlich übersichtlich für spätere Wartungs- / Anpassungsarbeiten an Abfragen.
Zudem hat das noch eine Bedeutung bei Deiner 3. Frage.
2.)
Das "a"."Einkaufsdatum" wird simpel ausgedrückt bei der Auswertung des SQL-Statements wieder in "Einkauf"."Einkaufsdatum" zurückübersetzt
3.)
1.)
Das ist die abgekürzte Syntax fürWas genau bewirktund warum tust Du das? Wird hier die Tabelle "Einkauf" quasi dupliziert und die Dublette als "a" bezeichnet?Code: Alles auswählen
"Einkauf" "a",
Code: Alles auswählen
"Einkauf" AS "a"
Code: Alles auswählen
SELECT "Einkaufsdatum" AS "Datum"
Zudem hat das noch eine Bedeutung bei Deiner 3. Frage.
2.)
S.o., es handelt sich nicht um eine Dublette, sondern um die Tabelle "Einkauf", die mit dem Alias "a" versehen ist.Warum greifst Du dann in (...) auf die Dublette zu?
Das "a"."Einkaufsdatum" wird simpel ausgedrückt bei der Auswertung des SQL-Statements wieder in "Einkauf"."Einkaufsdatum" zurückübersetzt
3.)
Das Stichwort dazu ist "Korrelierte Unterabfragen" - im Internet wirst Du haufenweise Erklärungen dazu finden (z.B. MySQL Referenzhandbuch).Was bewirktCode: Alles auswählen
AND "a"."Einkaufsdatum" = (SELECT MAX("Einkaufsdatum") FROM "Einkauf" WHERE "a"."Name" = "Name")