AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken ACCESS: mehrfach benutzter Parameter in UNION ?

ACCESS: mehrfach benutzter Parameter in UNION ?

Ein Thema von FediDelPr · begonnen am 18. Feb 2019 · letzter Beitrag vom 21. Feb 2019
Antwort Antwort
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

ACCESS: mehrfach benutzter Parameter in UNION ?

  Alt 18. Feb 2019, 17:35
Datenbank: ACCESS • Version: 2016 • Zugriff über: ADO
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 ?
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#2

AW: ACCESS: mehrfach benutzter Parameter in UNION ?

  Alt 18. Feb 2019, 18:00
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 AbfrageAs Was FROM Hierarchie h1a WHERE (h1a.Parent = :ParamInteger1)
UNION
SELECT ArtLink, 'Zweite AbfrageAs Was FROM
  (SELECT ArtLink, Parent FROM Hierarchie h2a WHERE (h2a.Parent = :ParamInteger1))
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#3

AW: ACCESS: mehrfach benutzter Parameter in UNION ?

  Alt 18. Feb 2019, 20:12
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 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 = 'ParamInteger1then
    param.Value := 1;
end;
  Mit Zitat antworten Zitat
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: ACCESS: mehrfach benutzter Parameter in UNION ?

  Alt 18. Feb 2019, 20:13
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.

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 ?
  Mit Zitat antworten Zitat
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: ACCESS: mehrfach benutzter Parameter in UNION ?

  Alt 18. Feb 2019, 20:25
@Schokohase

werde ich probieren.
  Mit Zitat antworten Zitat
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: ACCESS: mehrfach benutzter Parameter in UNION ?

  Alt 20. Feb 2019, 22:40
@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 = 'ParamInteger1then
    param.Value := 1;
end;
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#7

AW: ACCESS: mehrfach benutzter Parameter in UNION ?

  Alt 20. Feb 2019, 23:10
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
2019-02-21-00_31_06-adoparams.png

Geändert von Schokohase (20. Feb 2019 um 23:33 Uhr)
  Mit Zitat antworten Zitat
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: ACCESS: mehrfach benutzter Parameter in UNION ?

  Alt 21. Feb 2019, 10:32
@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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 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