AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Datenbank Abfrage über 2 Tabellen

Ein Thema von Youuuu · begonnen am 27. Apr 2021 · letzter Beitrag vom 27. Apr 2021
Antwort Antwort
Seite 1 von 2  1 2   
Youuuu

Registriert seit: 9. Okt 2016
46 Beiträge
 
#1

Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 10:57
Hi folgendes Szenario.

Ich hol mir alle Daten der Tabelle Beispiel "Ausgaben" mit 2 weiteren Joins (Hauptabfrage).

Delphi-Quellcode:
Query.SQL.Text := 'Select * '+
                      'FROM '+DB_AUSGABEN+' AS A LEFT JOIN '+DB_WOHNUNGSDATEN+' AS W ON W.ID = A.IDWohnung LEFT JOIN '+DB_OBJEKTDATEN+' AS O ON O.ID = A.IDObjekt '+
                      'ORDER BY TimeStamp DESC;';
Und gehe diese Daten dann so z.B. durch:

Delphi-Quellcode:
         while not Query.Eof do
         begin
            // Daten
            Variable1 := QueryDokumente.FieldByName('1').AsString;
            Variable2 := QueryDokumente.FieldByName('2').AsString;
            Variable3 := QueryDokumente.FieldByName('3').AsString;
            Query.Next;
          end;

Jetzt ist es so, dass zu jeder Ausgabe, mehrere Dokumente hinzugefügt wurden sein können (bei einem Dokument wäre das kein Problem) und in DB_DOKUMENTE gespiechert werden, Zuweisung über die ID der Ausgabentabelle.


Kann ich das in einer Abfrage realisieren oder muss ich hierzu extra eine 2. Query Abfrage über die Dokumente machen?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.770 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 11:26
Wäre sinnvoll, den bei einem Join würdest Du ja eine Zeile pro Dokument erhalten.
Theoretisch wäre auch eine Pivot möglich (pro Dokument eine weiteres Feld)
Markus Kinzler
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.744 Beiträge
 
Delphi 7 Professional
 
#3

AW: Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 11:48
Zugegebenermaßen hab' ich Deine Frage nicht so ganz verstanden:

Du hast eine 1:n-Beziehung zwischen Ausgabe und Dokumente und möchtest diese noch mit in Deine Abfrage einfügen?
SQL-Code:
select * from Ausgabe A
left join Wohnungsdaten W ON W.ID = A.IDWohnung
left join Objektdaten O ON O.ID = A.IDObjekt
left join Dokumente D ON D.IDSpalteDieAufAusgabeVerweist = A.ID
order by A.ID, A.TimeStamp desc
Damit dürftes Du dann in Deiner Abfrage je Ausgabe soviele Sätze erhalten, wie Dokumente zur Ausgabe vorhanden sind.

In Deiner While-Schleife musst Du dann beachten, dass nicht jedes Next zwingend zu einer neuen Ausgabe führt, sondern dass Du je Ausgabe halt n Next beachten musst. Du musst dort also selbst auf einen Gruppenwechsel bei der Ausgabe.ID (also deren Änderung) achten.

Oder bei Deiner derzeitigen Lösung je Datensatz die Dokumente laden, was programmiertechnisch sicherlich deutlich einfacher zu realisieren ist. Unter Laufzeitbedingungen könnte es aber andererseits weniger gut sein. Kommt auf die Datenmenge an.

Wenn's um eine Lösung für die Bearbeitung eines Datensatzes durch einen Anwender geht, lade die Dokumente in 'nem zweiten Schritt.

Musst Du aber "Unmengen" von Ausgaben am Stück bearbeiten (Batchverarbeitung, ...) dann prüfe, was letztlich programiertechnisch und laufzeittechnisch zum besseren Ergebnis führt.

Möglich sind beide Wege plus
Zitat von mkinzler:
Theoretisch wäre auch eine Pivot möglich (pro Dokument eine weiteres Feld)
als weitere Alternative.
  Mit Zitat antworten Zitat
Youuuu

Registriert seit: 9. Okt 2016
46 Beiträge
 
#4

AW: Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 12:16
Wäre sinnvoll, den bei einem Join würdest Du ja eine Zeile pro Dokument erhalten.
Theoretisch wäre auch eine Pivot möglich (pro Dokument eine weiteres Feld)


Richtig, ich würde bei einem weiteren Join nur ein Dokument ausgegeben bekommen statt aller.

Ich verwende hier MySQL, wie meinst du das mit Pivot?
  Mit Zitat antworten Zitat
Youuuu

Registriert seit: 9. Okt 2016
46 Beiträge
 
#5

AW: Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 12:18

Oder bei Deiner derzeitigen Lösung je Datensatz die Dokumente laden, was programmiertechnisch sicherlich deutlich einfacher zu realisieren ist. Unter Laufzeitbedingungen könnte es aber andererseits weniger gut sein. Kommt auf die Datenmenge an.


Richtig, so mach ich es aktuell mit einer zusätzlichen Abfrage, welche die Dokumente läd, dadurch wird allerdings die Abfragezeit natürlich immer weiter erhöht.

Geändert von Youuuu (27. Apr 2021 um 12:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.252 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 12:24
Wäre sinnvoll, den bei einem Join würdest Du ja eine Zeile pro Dokument erhalten.
Theoretisch wäre auch eine Pivot möglich (pro Dokument eine weiteres Feld)


Richtig, ich würde bei einem weiteren Join nur ein Dokument ausgegeben bekommen statt aller.
Wie kommst Du darauf? Du bekommst je Dokument einen Datensatz, der dann aber auch alle Daten aus den anderen Tabellen enthält.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.368 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 12:24
Es kommt natürlich drauf an, ob LEFT, INNER oder OUTER-JOIN, wie/ob Datensätze rauskommen, wo eine gejointe Tabelle nichts fand.


Und ganz wichtig, SQLs niemals direkt zusammenbauen.
Verwende unbedingt Parameter und Macros.

Und wenn Namen direkt oder via Makro ins SQL kommen, dann die richtige Escape-/Quote-Funktion der Datenbankklassen verwenden.

(nein Delphi-Referenz durchsuchenQuoteStr steht zwar in vielen Beispielen, aber das kennt nur das Quoting für Pascal-Strings, aber nicht für SQL-Strings)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
1.744 Beiträge
 
Delphi 7 Professional
 
#8

AW: Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 12:28
Suchbegriff: mysql pivot -> https://modern-sql.com/de/anwendung/pivot
Richtig, so mach ich es aktuell mit einer zusätzlichen Abfrage die Dokumente laden, dadurch wird allerdings die Abfragezeit natürlich immer weiter erhöht.
Nicht zwingend, der Left-Join mit zusätzlichen Dokumenten muss nicht schneller sein, als das einzelne Nachladen der Dokumente je Ausgabe.

Was sind bei Dir Dokumente konkret. Je Dokument ein Datensatz mit Infos zum Dokument oder Blobs mit mehr oder weniger großen Inhalt wie z. B. PDFs ...

Wenn da so richtig viele PDFs per Left-Join geladen werden, kann das schon ganz schön an der Performance kratzen, wenn es mal mit dem Speicher eng wird, ...
  Mit Zitat antworten Zitat
Youuuu

Registriert seit: 9. Okt 2016
46 Beiträge
 
#9

AW: Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 15:08
Wäre sinnvoll, den bei einem Join würdest Du ja eine Zeile pro Dokument erhalten.
Theoretisch wäre auch eine Pivot möglich (pro Dokument eine weiteres Feld)


Richtig, ich würde bei einem weiteren Join nur ein Dokument ausgegeben bekommen statt aller.
Wie kommst Du darauf? Du bekommst je Dokument einen Datensatz, der dann aber auch alle Daten aus den anderen Tabellen enthält.

Wie meinst du das, also wenn als Hauptabfrage doch "'FROM '+DB_AUSGABEN+' AS A" genutzt wird und ich springe auf den nächsten Datensatz, dann springt er doch in dieser Tabelle auf den nächsten Datensatz und nicht in der Dokumententabelle auf das nächste Dokument?

Etwas schwierig für mich das hier genau zu beschreiben, ich hoffe man versteht es?



@mkinzler

In der Dokumententabelle, liegen lediglich die Pfade zu den Dokumenten auf dem FTP Server.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.252 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Datenbank Abfrage über 2 Tabellen

  Alt 27. Apr 2021, 15:51
Er springt nicht in der Tabelle auf den nächsten Datensatz, sondern in Deiner Ergebnismenge. Probier doch Deine Statements erst einmal in einem SQL-Editor aus, dann siehst Du auch besser, was Du machen musst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

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 +2. Es ist jetzt 14:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf