AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Join mit tfdquery

Ein Thema von braunbaer · begonnen am 9. Jan 2017 · letzter Beitrag vom 9. Jan 2017
Antwort Antwort
braunbaer

Registriert seit: 15. Okt 2008
Ort: Vorarlberg
114 Beiträge
 
Delphi 11 Alexandria
 
#1

Join mit tfdquery

  Alt 9. Jan 2017, 17:59
Datenbank: MSSQL • Version: 2012 • Zugriff über: FireDac
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
Gebhard Blank
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Join mit tfdquery

  Alt 9. Jan 2017, 18:08
Geht so nicht. Das sind ja 2 getrennte Abfragen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.275 Beiträge
 
Delphi 12 Athens
 
#3

AW: Join mit tfdquery

  Alt 9. Jan 2017, 18:09
Moin...
Das nennt sich Subselect und sollte jede Datenbank Komponente verstehen...

Nachtrag:
Ich hatte das "Select ADR_ID from FDQuery1" übersehen. So etwas macht man auch nicht...
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Join mit tfdquery

  Alt 9. Jan 2017, 18:14
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'
Gruß, Jo

Geändert von jobo ( 9. Jan 2017 um 18:22 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: Join mit tfdquery

  Alt 9. Jan 2017, 18:53
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.
  Mit Zitat antworten Zitat
braunbaer

Registriert seit: 15. Okt 2008
Ort: Vorarlberg
114 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Join mit tfdquery

  Alt 9. Jan 2017, 20:07
hallo zusammen,

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

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

Danke für die Antworten
Gebhard
Gebhard Blank
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#7

AW: Join mit tfdquery

  Alt 9. Jan 2017, 23:25
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 13:20 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