AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi mittelschweres Select über mehrere Tabellen
Thema durchsuchen
Ansicht
Themen-Optionen

mittelschweres Select über mehrere Tabellen

Ein Thema von Thanatos81 · begonnen am 25. Nov 2005 · letzter Beitrag vom 25. Nov 2005
Antwort Antwort
Thanatos81
(Gast)

n/a Beiträge
 
#1

mittelschweres Select über mehrere Tabellen

  Alt 25. Nov 2005, 20:02
Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos
Folgende Situation:

Ein SQL-Anfänger, ich, hat zwei Tabellen, Debitoren und Fibu.

Nun möchte ich in ner Select alle Debitoren auswählen und zusätzlich aus der Fibu die Spalte Saldo. Also eigentlich nur

SELECT Debitoren.DebitorenNr, Debitoren.KRZ, Debitoren.DienststellenNr, Debitoren.Anrede, Debitoren.Zuname, Debitoren.Vorname, Debitoren.Eintritt, Fibu.Saldo FROM Debitoren, Fibu ORDER BY DebitorenNr Nun gibt es neben fibu.Saldo auch fibu.konto in dieser steht die Debitoren.DebitorenNr. Also soll das auch zugeordnet werden. Aber es kommt noch schlimmer: Zu jeder DebitorenNr gibt es mehrete Datensätze in fibu. Nun soll aber nur der Datensatz mit der höchsten ID genommen werden. Ein erstes Ansatz mit

SELECT Debitoren.DebitorenNr, Debitoren.KRZ, Debitoren.DienststellenNr, Debitoren.Anrede, Debitoren.Zuname, Debitoren.Vorname, Debitoren.Eintritt, Fibu.Saldo FROM Debitoren, Fibu Where (fibu.konto = debitoren.debitorennr) liefert einige Probleme zu Tage, zB das nur noch die Debitoren angezeigt werden, bei denen auch eine Buchung vorhanden ist.

Irgendjemand ne Idee, welche SQL-Befehle mir da weiter helfen können?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: mittelschweres Select über mehrere Tabellen

  Alt 25. Nov 2005, 20:26
Hallo Thomas,

es ist nicht unbedingt gut, wenn du in der Tabelle FIBU einen Saldo mitführst. Es handelt sich beim Saldo ja schließlich um ein berechnetes Feld.

SQL-Code:
SELECT d.DebitorenNr, SUM(f.Buchungsbetrag) AS Saldo
FROM Debitoren d LEFT OUTER JOIN Fibu f ON f.Konto = d.DebitorenNr
GROUP BY d.DebitorenNr
Ist jetzt nicht getestet, aber vielleicht hilft es dir auf die Sprünge.

Grüße vom marabu
  Mit Zitat antworten Zitat
McLane

Registriert seit: 4. Sep 2004
37 Beiträge
 
Delphi 5 Professional
 
#3

Re: mittelschweres Select über mehrere Tabellen

  Alt 25. Nov 2005, 21:06
Zitat von Thanatos81:
SELECT Debitoren.DebitorenNr, Debitoren.KRZ, Debitoren.DienststellenNr, Debitoren.Anrede, Debitoren.Zuname, Debitoren.Vorname, Debitoren.Eintritt, Fibu.Saldo FROM Debitoren, Fibu Where (fibu.konto = debitoren.debitorennr) liefert einige Probleme zu Tage, zB das nur noch die Debitoren angezeigt werden, bei denen auch eine Buchung vorhanden ist.

Irgendjemand ne Idee, welche SQL-Befehle mir da weiter helfen können?
SQL-Code:
SELECT D.DebitorenNr,
       D.KRZ,
       D.DienststellenNr,
       D.Anrede,
       D.Zuname,
       D.Vorname,
       D.Eintritt,
       F.Saldo
FROM Debitoren D, Fibu F
Where ((F.konto = D.debitorennr) or (F.konto is null))
Hi Thomas,
nen Left Outer Join kann man simulieren, indem du die Verknüpfungsbedinung um de ... is null ... part erweitert.
Das Feld, welches auf is null geprüft wird sollte aus der Tabelle kommen, deren Datensätze evtl nicht vorhanden sind.

[edit]Leider weiß ich gar nichts über Firebird und ob Left outer Joins unterstützt werden, daher die simulierte Variante.[/edit]

Nun folgt eine Kann-Regel: Immer Alias Vergeben (siehe Abfrage). Muss man nicht machen, finde es nur lesbarer und schneller zu tippen.

MfG David
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#4

Re: mittelschweres Select über mehrere Tabellen

  Alt 25. Nov 2005, 21:19
Hi marabu,
keine Panik, das Feld Saldo ist auch ein berechnetes Feld

Deswegen komm ich mit deinem Code auch nur halb zu Recht. Wenn ich die von mir benötigten Spalten aus Debitoren mitnehme sieht das so aus:
SQL-Code:
SELECT d.DebitorenNr, d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, SUM(f.Saldo) AS Saldo
FROM Debitoren d LEFT OUTER JOIN Fibu f ON f.Konto = d.DebitorenNr
GROUP BY d.DebitorenNr, d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, d.Eintritt
Nun möchte ich das Saldo aber ja nicht summieren, lasse ich aber das sum weg, möchte Firebird f.saldo mit in der Group By haben.

Mache ich das, so bekomme ich die Datensätze mit einem Saldo mehrfach.

Mit
SQL-Code:
SELECT d.DebitorenNr, d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, (SUM(f.Haben)-SUM(f.Soll)) AS Saldo
FROM Debitoren d LEFT OUTER JOIN Fibu f ON f.Konto = d.DebitorenNr
GROUP BY d.DebitorenNr, d.KRZ, d.DienststellenNr, d.Anrede, d.Zuname, d.Vorname, d.Eintritt
bekomme ich das richtige Ergebniss, allerdings ist die Tabellenstruktur vorgegeben, und wenn es das Feld schon gibt, würde ich das schon ganz gerne nutzen

@David
Haut auch mit der über ICQ besprochenen Änderung nicht hin, trotzdem Danke Firebird kennt übrigens Left Outer joins, falls du mal was mit Interbase gemacht hast, die Syntax ist fast identisch.
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#5

Re: mittelschweres Select über mehrere Tabellen

  Alt 25. Nov 2005, 21:32
So, dank Davids Hilfe per ICQ ist das ganze jetzt gelöst:
SQL-Code:
SELECT d.DebitorenNr,
   d.KRZ,
   d.DienststellenNr,
   d.Anrede,
   d.Zuname,
   d.Vorname,
   F.Saldo
FROM Debitoren d
   LEFT OUTER JOIN Fibu f
   ON f.Konto = d.DebitorenNr
   AND (f.ID = (SELECT MAX(F1.ID) FROM Fibu F1 Where F1.Konto = F.Konto))
GROUP BY d.DebitorenNr,
   d.KRZ, d.DienststellenNr,
   d.Anrede,
   d.Zuname,
   d.Vorname,
   d.Eintritt
Wahlweise auch ohne GROUP BY
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:02 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