Problem mit Abfragen über mehrere Tabellen

Hallo,

folgendes Problem hab ich noch.
So werden mir nur Datensätze aus der "tabelle1" ausgegeben wenn sie in "tabelle2" vorkommen. Ist "tabelle2" leer werden auch keine Datensätze ausgegeben.

Code:
SELECT 
  a.*, b.* 
FROM 
  tabelle1 a
JOIN 
  tabelle2 b
ON  
  a.id = b.b_id
HAVING   
  a.budget < SUM(b.betrag)

Um dies zu verhindern verwende ich laut diesem Tutorial einen LEFT JOIN, allerdings werden auch dann keine Datensätze ausgegeben.

Code:
SELECT 
  a.*, b.* 
FROM 
  tabelle1 a
LEFT JOIN 
  tabelle2 b
ON  
  a.id = b.b_id
HAVING   
  a.budget < SUM(b.betrag)

Woran liegt das?

Lg
 
Zuletzt bearbeitet:
Hi,

das ist ganz logisch. Das liegt an der HAVING-Klausel. Dort schränkst Du ja auf a.budget < SUM(b.betrag) ein. Bei einem LEFT JOIN sind die Spalten aus Tabelle b bei einem nicht vorhandenen Datensatz aber alle NULL, d.h. die Summe wäre also auch NULL und die HAVING-Bedingung trifft nicht zu. In dem Fall müsstest Du das um ein OR SUM(b.betrag) IS NULL erweitern.

LG
 
Wenn ich "a.budget < SUM(b.betrag) OR " weglasse, müssten theoretisch alle Einträge aus Tabelle 1 angezeigt werden, wenn Tabelle 2 leer ist. Hab ich das richtig verstanden?

Code:
SELECT 
  a.*, b.* 
FROM 
  tabelle1 a
LEFT JOIN 
  tabelle2 b 
ON  
  a.id = b.b_id
HAVING   
  a.budget < SUM(b.betrag) OR SUM(b.betrag) IS NULL

Ich bekomme immer nur 1 Datensaz aus Tabelle 1, sobald in Tabelle 2 das Budget auch nicht kleiner als die Summe ist, wird dieser Datensatz trotzdem ausgeblendet.

Versucht hab ich es auch so:

Code:
SELECT 
  a.*, b.* 
FROM 
  tabelle1 a
LEFT JOIN 
  tabelle2 b 
ON  
  a.id = b.b_id
HAVING   
  a.budget < SUM(b.betrag) OR a.budget < SUM(b.betrag) IS NULL
Allerdings ist das Ergebnis gleich.

Lg
 
Zuletzt bearbeitet:
Obwohl Tabelle 1 meherer einträge hat und Tabelle 2 leer ist, wird mir auch so nur ein Datensatz angezeigt. Dürfte eigentlich nicht sein oder?

Code:
SELECT 
  a.*, b.* 
FROM 
  tabelle1 a
LEFT JOIN 
  tabelle2 b 
ON  
  a.id = b.b_id
HAVING   
  a.budget < SUM(b.betrag) IS NULL

Ich möchte ja nur die Datensätze aus Tabelle 1 ausgeben, die das Budget noch nicht überschritten haben. Und das Budget ist überschritten sobald die Summe der Beträge größer als das Budget ist. Das bedeutet sobald das Budget kleiner als die Summe der beträge ist, soll der Datensatz angezeigt werden.

LG
 
Hi,

so ergibt die HAVING-Klausel keinen Sinn. Dein erster Versuch war richtig.

proloser hat gesagt.:
Code:
SELECT 
  a.*, b.* 
FROM 
  tabelle1 a
LEFT JOIN 
  tabelle2 b 
ON  
  a.id = b.b_id
HAVING   
  a.budget < SUM(b.betrag) OR SUM(b.betrag) IS NULL

Das sollte eigentlich bei korrekten Daten das gewünschte Ergebnis bringen.

LG
 
Nein funktioniert leider nicht ...

So werden alle Datensätze von Tabelle 1 angezeigt:
Code:
SELECT 
  a.*, b.* 
FROM 
  tabelle1 a
LEFT JOIN 
  tabelle2 b 
ON  
  a.id = b.b_id

Sobald ich "GROUP BY b.b_id" hinzufüge, wird nur noch 1 Datensatz ausgegeben, ich denke das Problem liegt darin damit etwas Gruppiert werden soll, das gar nicht vorhanden ist, denn die Tabelle 2 ist ja leer.

Ich muss mir was anderes überlegen denn so komm ich nicht weiter, falls noch jemand ein tipp hat wäre ich froh ;)

Lg
 
Du musst logischerweise auch nach a.id gruppieren.

Und übrigens hatte ich übersehen, dass Du da schon wieder die HAVING-Klausel ohne GROUP BY hattest. Das ergibt doch keinen Sinn.

LG
 
Hi,

also ich hab jetzt alles nochmal überarbeitet und angepasst:

Code:
SELECT 
  a.*, b.*
FROM 
  tabelle1 a
LEFT JOIN 
  tabelle2 b 
ON  
  a.id = b.b_id  
GROUP BY 
  a.id   
HAVING   
  b.b_id IS NULL OR ( a.id = b.b_id AND (a.budget - X.TEST) > SUM(b.betrag) )

Funktioniert so perfekt, hab aber noch eine Frage ...

Das ganze sieht so so aus:

ID | BUDGET | TEST
1 | 10 | 2
2 | 15 | 3
3 | 90 | 10
4 | 80 | 5

Bei "X.TEST" soll immer die Zahl (Feld "TEST) vom darunterliegenden Datensatz eingefügt werden. Ein paar Tipps wie ich das mache, würden mir reichen.

Lg
 
Zurück