Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ACCESS: mehrfach benutzter Parameter in UNION ? (https://www.delphipraxis.net/199766-access-mehrfach-benutzter-parameter-union.html)

FediDelPr 18. Feb 2019 17:35

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:
SELECT DISTINCT Parent FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger1)

UNION

SELECT ArtLink FROM
  (SELECT ArtLink, Parent FROM Hierarchie h2a WHERE (h2a.Parent = :ParamInteger1))
Als Resultatmenge kommt immer nur die Menge des ersten SELECTs.

Hat da jemand eine Idee ?
Ev auch kleiner Trick damit ich den Parameter nur einmal übergeben muss ?

Delphi.Narium 18. Feb 2019 18:00

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))

Schokohase 18. Feb 2019 20:12

AW: ACCESS: mehrfach benutzter Parameter in UNION ?
 
Das Problem liegt darin wie bei ADODB die Parameter verwaltet werden.

In der Abfrage
SQL-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))
befinden sich aus der Sicht von ADODB zwei Parameter mit dem gleichen Namen. Folgender Code
Delphi-Quellcode:
ADOQuery1.Parameters.ParamByName('ParamInteger1').Value := 1;
setzt allerdings nur den Parameter-Wert für den ersten Parameter.

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;

FediDelPr 18. Feb 2019 20:13

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 ?

FediDelPr 18. Feb 2019 20:25

AW: ACCESS: mehrfach benutzter Parameter in UNION ?
 
@Schokohase

werde ich probieren.

FediDelPr 20. Feb 2019 22:40

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;

Schokohase 20. Feb 2019 23:10

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

FediDelPr 21. Feb 2019 10:32

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 14:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz