Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Join mit tfdquery (https://www.delphipraxis.net/191381-join-mit-tfdquery.html)

braunbaer 9. Jan 2017 16:59

Datenbank: MSSQL • Version: 2012 • Zugriff über: FireDac

Join mit tfdquery
 
Hallo zusammen,

ist es eigentlich möglich, sich in einer TFDQuery auf eine andere TFDQuery zu beziehen.
Als Datenbank habe ich MS-SQLServer im Einsatz.

Simples Beispiel:
FDQuery1.sql.text := 'Select ADR_ID from A_Adressen where ADR_Land = ''AT'' ';
FDQuery2.sql.text := 'Select * from Adressen where Umsatz > 20000 and ADR_ID in (Select ADR_ID from FDQuery1)' ;

Ich habe es leider selber noch nicht herausgefunden, meine aber sowas mal in einem Forum gesehen zu haben.

Bin ich auf dem Holzweg, oder ist es möglich (idealerweise sollte das natürlich mit Joins gehen).

Vielen Dank schon mal für eure Antworten.

Gebhard

mkinzler 9. Jan 2017 17:08

AW: Join mit tfdquery
 
Geht so nicht. Das sind ja 2 getrennte Abfragen.

haentschman 9. Jan 2017 17:09

AW: Join mit tfdquery
 
Moin...8-)
Das nennt sich Subselect und sollte jede Datenbank Komponente verstehen...:P

Nachtrag:
Ich hatte das "Select ADR_ID from FDQuery1" übersehen. So etwas macht man auch nicht...:stupid:

jobo 9. Jan 2017 17:14

AW: Join mit tfdquery
 
Ja, das nennt sich subselect so lange es komplett in einer Abfrage auf dem Server läuft.
Der Server, der die 2. Abfrage entgegennimmt, wird aber kaum etwas mit FDQuery1, der Delphircomponenten anfangen können. Die kennt er natürlich nicht.

Was funktionieren soll:
Code:
FDQuery2.sql.text := 'Select * from Adressen where Umsatz > 20000 and '+
                     'ADR_ID in ('Select ADR_ID from A_Adressen where ADR_Land = ''AT'' ')' ;
Am besten das Ganze noch mit Parametern für ADR_LAND.

P.S.:
Jedes "where <feld> in (Select <feld> from <table> [where..])"
kann man auch als Join formulieren:
Code:
-- mit join clause
Select a.*
  from Adressen a
  join A_Adressen aa
    on a.adr_id = aa.adr_id
 where a.Umsatz > 20000
   and aa.ADR_Land = 'AT'

-- oder
-- mit (altem) join 'Verfahren'
Select a.*
  from Adressen a, A_Adressen aa
 where a.ADR_ID = aa.ADR_ID
   and Umsatz > 20000
   and ADR_Land = 'AT'

nahpets 9. Jan 2017 17:53

AW: Join mit tfdquery
 
Vorsicht, nicht ganz ernst gemeinte Antwort ;-)
Delphi-Quellcode:
FDQuery1.sql.text := 'Select ADR_ID from A_Adressen where ADR_Land = ''AT'' ';
FDQuery2.sql.text := 'Select * from Adressen where Umsatz > 20000 and ADR_ID in (' + FDQuery1.sql.text + ') x)';
Aber wenn das dann funktioniert ist das eher Zufall als strukturiertes programmieren.

Und hier wird natürlich nicht des Ergebnis der Abfrage FDQuery1 genutzt, sondern nur das SQL dieser Abfrage in das SQL der Abfrage FDQuery2 eingebaut und das so entstandene SQL ausgeführt.

Sollte man tatsächlich seine SQLs so aufbauen, muss man sehr genau auf die Syntax der einzelnen Abfragen achten, um sie so korrekt zusammensetzen zu können.

Meiner Meinung nach ist das aber eher ein Vorgehen der Art: So sollte man es nicht machen.

Was natürlich, aber nur in einer begrenzen Menge, möglich wäre ist:
Delphi-Quellcode:
var
  s : String;
begin
  s := '';
  FDQuery1.Open;
  while not FDQuery1.EoF do begin
    s := s + ',' + FDQuery1.Fields[0].AsString;
    FDQuery1.Next;
  end;
  FDQuery1.Close;
  s := Copy(s,2,Length(s));
  FDQuery2.sql.text := 'Select * from Adressen where Umsatz > 20000 and ADR_ID in (' + s + ')';
  FDQuery2.Open;
  ...
Dabei sollte man aber bedenken, dass die Anzahl der Werte in den IN-Klausel datenbankabhängig unterschiedlich groß sein kann.
Bei so einem Konstrukt muss man mit entsprechenden Fehlern rechnen.

Wäre also nur dann eine sinnvolle Möglichkeit, wenn die beiden Abfragen gegen unterschiedliche Datenbanken laufen, die sich gegenseitig nicht kennen und von daher auch kein datenbankübergreifender Zugriff möglich ist.

braunbaer 9. Jan 2017 19:07

AW: Join mit tfdquery
 
hallo zusammen,

tja, dann war ich wohl auf dem Holzweg... :lol:

Was SQL angeht, ist alles klar.
Ich dachte mir halt, dass die Komponenten ebenfalls miteinander können sollten....

Danke für die Antworten
Gebhard

Uwe Raabe 9. Jan 2017 22:25

AW: Join mit tfdquery
 
Grundsätzlich geht sowas in der Art schon mit FireDAC - nennt sich Local SQL. Ob das allerdings für deinen Fall umgesetzt werden kann und dann auch noch performant ist, kann ich leider jetzt nicht sagen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 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