![]() |
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 |
AW: Join mit tfdquery
Geht so nicht. Das sind ja 2 getrennte Abfragen.
|
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: |
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:
Am besten das Ganze noch mit Parametern für ADR_LAND.
FDQuery2.sql.text := 'Select * from Adressen where Umsatz > 20000 and '+
'ADR_ID in ('Select ADR_ID from A_Adressen where ADR_Land = ''AT'' ')' ; 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' |
AW: Join mit tfdquery
Vorsicht, nicht ganz ernst gemeinte Antwort ;-)
Delphi-Quellcode:
Aber wenn das dann funktioniert ist das eher Zufall als strukturiertes programmieren.
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)'; 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:
Dabei sollte man aber bedenken, dass die Anzahl der Werte in den IN-Klausel datenbankabhängig unterschiedlich groß sein kann.
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; ... 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. |
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 |
AW: Join mit tfdquery
Grundsätzlich geht sowas in der Art schon mit FireDAC - nennt sich
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 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-2025 by Thomas Breitkreuz