Seite 1 von 1
Probleme mit Parameterabfrage
Verfasst: Fr, 29.10.2010 12:12
von Neujuenger2010
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?
Re: Probleme mit Parameterabfrage
Verfasst: Fr, 29.10.2010 16:41
von DPunch
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
Re: Probleme mit Parameterabfrage
Verfasst: Fr, 29.10.2010 19:00
von Neujuenger2010
Hallo!
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'
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!
Re: Probleme mit Parameterabfrage
Verfasst: Fr, 29.10.2010 19:49
von DPunch
Aloha
Neujuenger2010 hat geschrieben:Ich hab dann mal versucht, Deine Lösung zu modifizieren - mit dem gleichen Ergebnis (SQL-Modus erforderlich).
Das Problem in meinem Lösungsvorschlag ist lediglich der Kommentar - Base kann Kommentare nicht als solche interpretieren und spuckt deshalb die Fehlermeldung aus (sigh).
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
Re: Probleme mit Parameterabfrage
Verfasst: Fr, 29.10.2010 20:17
von Neujuenger2010
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
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")
auf die Dublette zu?
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!
Re: Probleme mit Parameterabfrage
Verfasst: Fr, 29.10.2010 21:20
von DPunch
Aloha
1.)
Was genau bewirkt
und warum tust Du das? Wird hier die Tabelle "Einkauf" quasi dupliziert und die Dublette als "a" bezeichnet?
Das ist die abgekürzte Syntax für
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.)
Warum greifst Du dann in (...) auf die Dublette zu?
S.o., es handelt sich nicht um eine Dublette, sondern um die Tabelle "Einkauf", die mit dem Alias "a" versehen ist.
Das "a"."Einkaufsdatum" wird simpel ausgedrückt bei der Auswertung des SQL-Statements wieder in "Einkauf"."Einkaufsdatum" zurückübersetzt
3.)
Was bewirkt
Code: Alles auswählen
AND "a"."Einkaufsdatum" = (SELECT MAX("Einkaufsdatum") FROM "Einkauf" WHERE "a"."Name" = "Name")
Das Stichwort dazu ist "Korrelierte Unterabfragen" - im Internet wirst Du haufenweise Erklärungen dazu finden (z.B.
MySQL Referenzhandbuch).