SQL Left outer Join Problem
Es werden nicht alle Inhalte der linken Tablle beim left outer join zurückgegeben
Tach NG, need education!!!
Habe in einer SQL (M$ SQL Server) Abfrage folgendes Problem.
Bei folgendem Join werden nicht alle Inhalte der linken Tabelle zurückgegeben.
select tblKonten.Konto,
tblKonten.Bezeichnung,
sum(viewAusgaben.KostenA) as KostA,
sum(viewAusgaben.KostenB) as KostB
from tblKonten
left outer join viewAusgaben
on tblKonten.Konto = viewAusgaben.Konto
group by tblKonten.Konto, tblKonten.Bezeichnung
order by tblKonten.Konto, tblKonten.Bezeichnung
soweit klappt alles!!! aber wenn ich noch eine Einschränkung auf den Zeitraum in der viewAusgaben machen werden nicht mehr alle Inhalte aus der linken Tabelle tblKonten zurückgegeben
where viewAusgaben.Monat >= 1 -- hier werden die Werte normalerweise per Variable an die procedure übergeben
and viewAusgaben.Monat <= 12
Weiß jemand wieso durch die where Einschränkung nicht mehr der komplette Inhalt aus der tblKonten (linke Tabelle) zurückgegeben wird?
Grüße und Danke für Lösungen und Lernhilfe
Kai
Tach NG, need education!!!
Habe in einer SQL (M$ SQL Server) Abfrage folgendes Problem.
Bei folgendem Join werden nicht alle Inhalte der linken Tabelle zurückgegeben.
select tblKonten.Konto,
tblKonten.Bezeichnung,
sum(viewAusgaben.KostenA) as KostA,
sum(viewAusgaben.KostenB) as KostB
from tblKonten
left outer join viewAusgaben
on tblKonten.Konto = viewAusgaben.Konto
group by tblKonten.Konto, tblKonten.Bezeichnung
order by tblKonten.Konto, tblKonten.Bezeichnung
soweit klappt alles!!! aber wenn ich noch eine Einschränkung auf den Zeitraum in der viewAusgaben machen werden nicht mehr alle Inhalte aus der linken Tabelle tblKonten zurückgegeben
where viewAusgaben.Monat >= 1 -- hier werden die Werte normalerweise per Variable an die procedure übergeben
and viewAusgaben.Monat <= 12
Weiß jemand wieso durch die where Einschränkung nicht mehr der komplette Inhalt aus der tblKonten (linke Tabelle) zurückgegeben wird?
Grüße und Danke für Lösungen und Lernhilfe
Kai
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 20296
Url: https://administrator.de/contentid/20296
Ausgedruckt am: 25.11.2024 um 07:11 Uhr
5 Kommentare
Neuester Kommentar
Hast Du Dir schon mal den Ablaufplan angeschaut?
Werden in der View auch schon Joins verwendet?
Gruß
dba
Werden in der View auch schon Joins verwendet?
Gruß
dba
Hallo Kai,
das liegt daran, daß die Auswertung des Zeitraums erst nach dem Outer Join erfolgt. Der Outer Join wird also korrekt ausgeführt, aber anschließend fliegen alle Datensätze raus, die das Monatskriterium nicht erfüllen. Hierzu zählen natürlich auch alle Konten, die gar keinen Datensatz in viewAusgaben haben, weil viewAusgaben.Monat in dem Fall nämlich NULL ist.
Abhilfe schafft man dadurch, daß die Einschränkung auf den Zeitraum in den Outer Join aufgenommen wird. Dann wird zunächst die Monatseinschränkung auf viewAusgaben ausgeführt und erst dann die übrigen Datensätze per Outer Join den Konten zugeordnet. Der passende SQL-Befehl lautet:
select tblKonten.Konto,
tblKonten.Bezeichnung,
sum(viewAusgaben.KostenA) as KostA,
sum(viewAusgaben.KostenB) as KostB
from tblKonten
left outer join viewAusgaben
on tblKonten.Konto = viewAusgaben.Konto
and (viewAusgaben.Monat >= 1 and viewAusgaben.Monat <= 12)
group by tblKonten.Konto, tblKonten.Bezeichnung
order by tblKonten.Konto, tblKonten.Bezeichnung
Gruß, Mad Max
das liegt daran, daß die Auswertung des Zeitraums erst nach dem Outer Join erfolgt. Der Outer Join wird also korrekt ausgeführt, aber anschließend fliegen alle Datensätze raus, die das Monatskriterium nicht erfüllen. Hierzu zählen natürlich auch alle Konten, die gar keinen Datensatz in viewAusgaben haben, weil viewAusgaben.Monat in dem Fall nämlich NULL ist.
Abhilfe schafft man dadurch, daß die Einschränkung auf den Zeitraum in den Outer Join aufgenommen wird. Dann wird zunächst die Monatseinschränkung auf viewAusgaben ausgeführt und erst dann die übrigen Datensätze per Outer Join den Konten zugeordnet. Der passende SQL-Befehl lautet:
select tblKonten.Konto,
tblKonten.Bezeichnung,
sum(viewAusgaben.KostenA) as KostA,
sum(viewAusgaben.KostenB) as KostB
from tblKonten
left outer join viewAusgaben
on tblKonten.Konto = viewAusgaben.Konto
and (viewAusgaben.Monat >= 1 and viewAusgaben.Monat <= 12)
group by tblKonten.Konto, tblKonten.Bezeichnung
order by tblKonten.Konto, tblKonten.Bezeichnung
Gruß, Mad Max