left join und where behindern sich gegenseitig?
bee
- datenbank
0 Sven Rautenberg0 Ilja0 Christian Seiler0 Ilja
Ein Hallo an alle SQL-Helden,
ich frage aus zwei verschiedenen Tabellen Daten ab, nach meinen Kenntnissen sorgt left join dafür, dass die linke Tabelle nur der Abfrage genügen muss. Die rechte kann aber auch mehrere Ergeniss haben. Also eine one to many Beziehung.(darum GROUP BY) Wenn aber die rechte passt, dann soll sie möglichst im Feld 'Typ' 1 sein.
SELECT * FROM (ff_webserverpic LEFT JOIN ff_webserverdat ON ff_webserverdat.DSN=ff_webserverpic.DSN) WHERE ff_webserverpic.TYP=1 GROUP BY ff_webserverdat.DSN
Nach dieser SQL werden aber nur Ergebnisse geliefert, in denen es auch in der rechten Tabelle ein passendes Ergebniss gibt. Weiß jemand, wie man das behebt.
Danke und Grüße soweit!
Moin!
ich frage aus zwei verschiedenen Tabellen Daten ab, nach meinen Kenntnissen sorgt left join dafür, dass die linke Tabelle nur der Abfrage genügen muss.
Deine Erkenntnisse sind falsch. Die WHERE-Bedingung bezieht sich auf die kombinierte Ergebnistabelle des JOINs.
Nach dieser SQL werden aber nur Ergebnisse geliefert, in denen es auch in der rechten Tabelle ein passendes Ergebniss gibt. Weiß jemand, wie man das behebt.
Formuliere eine passende WHERE-Bedingung.
yo,
Die rechte kann aber auch mehrere Ergeniss haben. Also eine one to many Beziehung.(darum GROUP BY)
hier ist vorsicht geboten. sicherlich wirst du mehrere datensätze der rechten tabelle für einen datensatz der linken tabelle finden können. aber das ist dann erst einmal auch nicht so schlimm, werden halt mehrere angezeigt. was bei deinem GROUP BY viel schlimmer ist, dass du nur die die spalten bei der ausgabe anzeigen kannst, die entweder aggregat-funktion oder aber in der GROUP BY anweisung selbst enhalten sind. und das wäre in deinem falle nur ff_webserverdat.DSN. sprich dein * (anzeigen aller spalten) geht hier nicht und nur mysql wird dabei keinen fehler auspucken. alle anderen dbms werden bei der anweisung meckern. deshalb würde ich das group by erst einmal rausnehmen und noch besser, dass * auch. vielleicht kannst du uns ja noch mal mitteilen, welche spalten genau angezeigt werden sollen, dann kann man eine lösung knobbeln.
Wenn aber die rechte passt, dann soll sie möglichst im Feld 'Typ' 1 sein.
hier läßt du zuviel vorsicht walten. möglichst ist leider ein wort, dass in dbms nicht eingebaut ist, sondern du solltest dich schon darauf festlegen. ;-)
Nach dieser SQL werden aber nur Ergebnisse geliefert, in denen es auch in der rechten Tabelle ein passendes Ergebniss gibt. Weiß jemand, wie man das behebt.
wie bereits Sven gesagt hat, wird erst der JOIN ausgeführt und dann die Bedingungen in der WHERE klausel mit reingenommen. und durch den LEFT JOIN könen sich in der spalte ff_webserverpic.TYP auch NULL werte befinden. und NULL ist auf jeden fall ungleich 1, werden also damit rausgeworfen. du kannst das lösen, wie Sven sagt:
SELECT spalten
FROM ff_webserverpic LEFT JOIN ff_webserverdat
ON (ff_webserverdat.DSN=ff_webserverpic.DSN)
WHERE ff_webserverpic.TYP=1 OR ff_webserverpic.TYP = NULL
oder aber du kannst die bedingung mit in die JOIN Klausel mit reinnehmen.
SELECT spalten
FROM ff_webserverpic LEFT JOIN ff_webserverdat
ON (ff_webserverdat.DSN=ff_webserverpic.DSN AND ff_webserverpic.TYP=1)
Ilja
Hallo Ilja,
WHERE ff_webserverpic.TYP=1 OR ff_webserverpic.TYP = NULL
Kleine Korrektur: Es muss hier IS NULL, nicht = NULL. heißen.
Viele Grüße,
Christian
yo,
Kleine Korrektur: Es muss hier IS NULL, nicht = NULL. heißen.
genau, guter hinweis. so oft benutzt und doch nicht wiedererkannt ;-)
Ilja