SQL Abfrage (Having Klausel) - PostgreSQL

Master1991

Lieutenant
Registriert
Okt. 2007
Beiträge
689
Hi,

es geht um die folgende Abfrage

Code:
create or replace view vGema as 
	select s.titel as "Songtitel", komponist as "Komponist", sum(preis) from
	Song s left outer join Aufnahmen an on (an.song=s.songnr) left outer join Album a on (an.albnr=a.albnr)
	group by s.titel, komponist having (extract(year from current_date)-20)>max(an.jahr)
	order by s.titel;

So, das ganze ist eine PostgreSQL Datenbank.

Mein Problem ist nun das in der Songtabelle ein Titel erscheint der in der Aufnahmen Tabelle nicht referenziert wird.
Es exisitert also keine Aufnahme von diesem Song.

Die Abfrage soll nun bewirken das alle Songs die in den letzen 20 Jahren nicht aufgenommen wurden, angezeigt werden. Also auch der Song der nicht weiter referenziert wurde (Da er von 1976 ist) ... (Deshalb auch der left outer join) ... DAs Problem ist das die Abfrage der Having Klausel die "null" Werte rausschmeißt...Wie bekomm ich die Null Werte mit in das Ergebnis?

Was mir dabei grad so auffällt wäre der Song der nicht referenziert wird von 2000 hätte er trotzdem nen null Wert, da er nicht referenziert wird. Soll aber nicht im Ergebnis angezeigt werden.

Hmm, okay was ich dann eigendlich brauche ist ein "Temporärer" Update Befehl der das Jahr aus der Songtabelle dort übernimmt wo kein Song in der Aufnahmen Tabelle referenziert wird.

Ich hoffe die Infos reichen so. Und es kann überhaupt jemand etwas davon verstehen

MfG
 
Die Abfrage soll nun bewirken das alle Songs die in den letzen 20 Jahren nicht aufgenommen wurden, angezeigt werden. Also auch der Song der nicht weiter referenziert wurde (Da er von 1976 ist) ... (Deshalb auch der left outer join) ... DAs Problem ist das die Abfrage der Having Klausel die "null" Werte rausschmeißt...Wie bekomm ich die Null Werte mit in das Ergebnis?

Naja klar, bei einer Aggregation gehen null-Werte immer verloren. Und die Having-Klausel bezieht sich nun mal auf einen aggregierten Wert.
Du musst deine null-Werte vorm gruppieren mit default-Werten belegen, damit diese beim Having berücksichtigt werden.
 
Hallo,
ich kann mich irren, aber gehört das Having nicht in die WHERE Klausel?
LG
 
Schattenengel schrieb:
Hallo,
ich kann mich irren, aber gehört das Having nicht in die WHERE Klausel?
LG

Nein.
Das Having ist zwar eine Art Where-Klausel, bezieht sich aber auf aggregierte Daten. Daher musst du natürlich vorher irgendetwas gruppieren.

Zum Verständnis (Beispiel ist aus der Luft gegriffen):

Code:
SELECT vorname, count(nachname) as AnzahlNachname 
FROM tabelle 
GROUP BY vorname 
HAVING count(nachname) > 1

=

Code:
SELECT Unterabfrage.vorname, Unterabfrage.AnzahlNachname 
FROM (SELECT vorname, count(nachname) as AnzahlNachname FROM tabelle GROUP BY vorname) as Unterabfrage
WHERE Unterabfrage.AnzahlNachname > 1
 
Zuletzt bearbeitet:
Zurück
Oben