![]() |
Datenbank: ACCESS • Version: 2016 • Zugriff über: ADO
ACCESS: mehrfach benutzter Parameter in UNION ?
Es soll ein Parameter (INTEGER) an ein SQL-Statement übergeben werden und zwar
gleich mehrfach. Mehrere Abfragen werden dann durch UNIONs verknüpft. Jeder dieser Abfragen enthält den selben Parameter. Hier ein einfaches Beispiel:
Delphi-Quellcode:
Als Resultatmenge kommt immer nur die Menge des ersten SELECTs.
SELECT DISTINCT Parent FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger1)
UNION SELECT ArtLink FROM (SELECT ArtLink, Parent FROM Hierarchie h2a WHERE (h2a.Parent = :ParamInteger1)) Hat da jemand eine Idee ? Ev auch kleiner Trick damit ich den Parameter nur einmal übergeben muss ? |
AW: ACCESS: mehrfach benutzter Parameter in UNION ?
Das hat nix mit den Parametern zu tuen, in einem SQL eine Parameter mehrfach verwenden, mache ich seit Jahr und Tag regelmäßig, funktioniert bei allen Datenbanken problemlos.
Distinct macht aus mehreren Datensätzen des ersten Selects einen Datensatz. Union fügt die zweite Ergebnismenge dazu und sorgt für Eindeutigkeit der gesamten Ergebnismenge. Wenn nun beim ersten Select Parent = Delphi sein sollte und beim zweiten Select ArtLink = Delphi, so enthält die Ergebnismenge des Union nur eine Zeile mit dem Wert Delphi. Wie ändert sich das Ergebnis, wenn Du statt Union mal Union All verwendest, bekommst du dann mehrere (ggfls. identische) Datenätze als Ergebnis? Bist Du sicher, dass Dein bisheriges Ergebnis nur Daten des ersten Selects enthält? Woran kannst Du das mit Sicherheit festmachen? Hast Du geprüft, ob beide Abfragen für sich alleine jeweils ein Ergebnis liefern? Hast Du sichergestellt, dass sie auch unterschiedliche Ergebnisse liefern? Ändert sich das Ergebnis, wenn Du die Abfrage in etwa so änderst?
SQL-Code:
SELECT DISTINCT Parent, 'Erste Abfrage' As Was FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger1)
UNION SELECT ArtLink, 'Zweite Abfrage' As Was FROM (SELECT ArtLink, Parent FROM Hierarchie h2a WHERE (h2a.Parent = :ParamInteger1)) |
AW: ACCESS: mehrfach benutzter Parameter in UNION ?
Das Problem liegt darin wie bei ADODB die Parameter verwaltet werden.
In der Abfrage
SQL-Code:
befinden sich aus der Sicht von ADODB zwei Parameter mit dem gleichen Namen. Folgender Code
SELECT DISTINCT Parent FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger1)
UNION SELECT ArtLink FROM (SELECT ArtLink, Parent FROM Hierarchie h2a WHERE (h2a.Parent = :ParamInteger1))
Delphi-Quellcode:
setzt allerdings nur den Parameter-Wert für den ersten Parameter.
ADOQuery1.Parameters.ParamByName('ParamInteger1').Value := 1;
Hier hilft nur die Iteration durch die Parameter und die Abfrage des Namens.
Delphi-Quellcode:
for param in ADOQuery1.Paramerters do
begin if param.Name = 'ParamInteger1' then param.Value := 1; end; |
AW: ACCESS: mehrfach benutzter Parameter in UNION ?
Danke für die prompte Antwort.
Ich habe nun alles nochmals überprüft: DISTINCT ist ok, vermutlich könnte man das auch einfacher formulieren, der Parameter im ersten SELECT enthält bereits den gesuchten Wert.
Delphi-Quellcode:
so etwa SELECT :ParamInteger1: FROM Hierarchie (nicht geprüft)
Das Resultat der ersten Abfrage kommt in der zweiten nicht vor (garantiert). Daher ist auch UNION ohne ALL ok. Die einzelnen Abfragen liefern die richtigen Ergebnisse. Mit dem Einfügen der Debug-Info 'erste bzw. zweite Abfrage' ändert nichts, aber es wird noch klarer. Mit zwei Parametern läuft die Geschichte, mit einem erscheint nach wie vor nur die Abfrage vor dem UNION. Ich habe früher schon einmal etwas sehr ähnliches realisiert. Auch da habe ich diese Verhalten festgestellt. Evtl. sieht's ohne UNION anders aus ? |
AW: ACCESS: mehrfach benutzter Parameter in UNION ?
@Schokohase
werde ich probieren. |
AW: ACCESS: mehrfach benutzter Parameter in UNION ?
@Schokohase
Ich verstehe deinen Vorschlag doch nicht ganz. Können wirklich mehrere Parametereinträge mit dem gleichen Namen existieren ?
Delphi-Quellcode:
Hier hilft nur die Iteration durch die Parameter und die Abfrage des Namens.
markieren Dein Delphi-Quellcode: for param in ADOQuery1.Paramerters do begin if param.Name = 'ParamInteger1' then param.Value := 1; end; |
AW: ACCESS: mehrfach benutzter Parameter in UNION ?
Liste der Anhänge anzeigen (Anzahl: 1)
Was soll ich darauf antworten, da du mir ja nicht glaubst.
Ich: "Doch!" Du: "Wirklich?" Ich: "Ja!" Du: "Nein, echt?" ... Schreib dir doch einfach ein Stück Code, das dir alle Parameter einer Query mit Namen ausgibt. Oder du schaust einfach mal in den Objekt-Inspektor Anhang 50732 |
AW: ACCESS: mehrfach benutzter Parameter in UNION ?
@Schokohase
Es ist nicht so, dass ich dir nicht glaube. Viele eher, ich verstehe deinen Code einfach noch nicht. Ich habe gesehen, dass mehrere Parametereinträge unter dem gleichen Namen möglich sind. Mir ist aber nicht klar wie dann zwischen den Einträgen unterschieden wird, in welchen ich den Wert wirklich eintrage. Überhaupt ist mir noch nicht klar, wie und wann die Einträge in ADOQueryx.Parameters wirklich erfolgen. Durch Parameter-Extraktion des SQL-Textes ? Wenn ich diesen ändere, wird dann die Parameterliste nachgeführt ? Wenn ich sie explizit bearbeite, was ich normalerweise nicht tue, wie ist dann das Verhalten ? Mir scheint sie wird dann nicht durch Parameter im SQL-Text überschrieben. Ich habe schon sehr viele Stunden mit Delphi verbracht, aber eigentlich ist das nur ein Randjob von mir und ich verwende daher nicht die enormen Möglichkeiten der IDE. Ein Beispiel: Wie schaue ich mir die tatsächlichen Parameter-Einträge zur Runzeit an ? Da kenne ich sicher noch nicht alle Möglichkeiten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz