*jiriki*: SQL Abfrage über drei Tabellen

Beitrag lesen

Hallo,

Dein Problem scheint mir analog zu dem in diesem Archivthread zu sein.

Du versuchst Dich an der von mir (dort mit einem View statt der temporären Tabelle) vorgestellten Lösung, bei geeigneter Unterstützung durch das DBMS, das Du uns geflissentlich verschweigst, würde ich Iljas Lösung bevorzugen.

Die Tatsache, dass es bei Dir drei Tabellen gibt, ändert das Problem nicht grundlegend, ein JOIN oder zwei mehr.

Dein SQL-Code ist fehlerhaft:

CREATE TEMPORARY TABLE
tmp
SELECT
kunden_nr, vertrags_nr, MAX( eintragung ) as last
FROM
rechnung
GROUP BY vertrags_nr;


> es fehlt die Gruppierung nach kunden\_nr.  

Weil das ne SQL-Vorgabe ist? Notwendig ists nicht. Kann man nach zwei Spalten gruppieren?  

>   
> > Hier kommt das gewünschte Ergebnis raus.  
>   
> Das erhöht die Wahrscheinlichkeit, dass Du MySQL verwendest. Ich kenne halt kein anderes DBMS, das diesen fehlerhaften Code schluckt.  
  
Stimmt. MySQL 4.0.20a (debug) um genau zu sein.  

>   
> > Nun möchte ich in einer zweiten Abfrage die Datensätze in der Temporären Tabelle mit den zugehörigen Werten aus den drei Tabellen kunden, vertrag und rechnung auffüllen.  
>   
> Wenn ich Dich richtig verstanden habe, dann hättest Du gern zu jedem Vertrag die neueste Rechnung mit Rechnungsdetails, ein paar Vertragsdetails und ein paar Kundendetails. Richtig?  
>   
> ~~~sql
  

> SELECT  
>     s.firma,  
>     s.kunden_nr,  
>     /* weitere Details aus s */  
>     v.preis,  
>     /* weitere Detais aus v */  
>     r.kunden_nr,  
>     r.vertrags_nr,  
>     r.rechnungs_nr,  
>     r.abrechnung  
> FROM  
>     rechnung as r  
> INNER JOIN vertrag as v ON r.vertrags_nr = v.vertrags_nr  
> INNER JOIN stamm as s ON v.kunden_nr = s.kunden_nr  
> 

liefert Dir alle Details zu allen Rechnungen aller Verträge aller Kunden. Auf diese Ausgangsbasis kannst Du analog die Lösungen in oben angeführtem Thread anwenden.

Klappt perfekt. Danke für den Tip. Wie würde ich hier jetzt noch die uspr., aber beim ersten Beitrag weggelassene WHERE-Bedingung unterbringen:

date_add( last, INTERVAL intervall MONTH ) <= NOW();

da ich nur die Rechnungen rausgreifen möchte, deren Rechnungsdatum plus eine bestimmte Zeit "intervall" dem aktuellen Datuzm entspricht oder unterschreitet?

PS: Die Spalte kunden_nr in der Tabelle rechnung ist redundant. Deswegen solltest Du diese Spalte dort weglassen. Selbstverständlich musst Du in diesem Fall bei Deiner Abfrage die kunden_nr aus der Tabelle vertrag auslesen.

Ja, das war mir bewusst, hab ich aber aus Bequemlichkeit in den SQL-Anfragen in Kauf genommen, weils die einzige Redundanz ist und der DB-Umfang gering ist.

Freundliche Grüße

Vinzenz

Danke! *jiriki*