LEFT JOIN, RIGHT JOIN, INNER JOIN, überall das gleiche Ergebnis?

Gray

Erfahrenes Mitglied
Hi,

ich habe aktuell ein Problem mit zwei per Join verknüpften Tabellen

Die Abfrage sieht wie folgt aus:

SQL:
SELECT
	*
FROM
	checklisten_felder cf 
LEFT JOIN 
	checkliste cl 
ON 
	cf.fd_id = cl.fd_id
WHERE
	cf.bereich = 'x'
AND
	cl.cs_id = 31
ORDER BY
	sortierung

Nun habe ich allerdings das Problem das mir aus der Tabelle checklisten_felder NIE alle Einträge ausgegeben werden.
Es spielt auch keine Rolle ob ich einen JOIN, RIGHT JOIN usw. mache. Ich bekomme immer nur die Datensätze ausgegeben die eine Übereinstimmung der ON-Parameter haben.

Was ich möchte ist das mir ALLE Einträge aus checklisten_felder ausgegeben werden und diese Verknüpft werden falls es eine Übereinstimmung der ON-Parameter gibt.

THX
 
Zuletzt bearbeitet von einem Moderator:
cl.cs_id = 31
Bei cf wo du kein cl hasst, schlägt diese Bedinung fehl
SQL:
(cl.cs_id = 31 OR cl.fd_id IS NULL)
 
Zuletzt bearbeitet von einem Moderator:
THX,

allerdings bleibt der Effekt der gleiche, ich bekomme noch immer nur die Daten ausgegeben die eine Übereisntimmung der ON-Parameter haben.

Die Query sieht nun so aus:

SQL:
SELECT
    *
FROM
    checklisten_felder cf 
LEFT JOIN 
    checkliste cl 
ON 
    cf.fd_id = cl.fd_id
WHERE
    cf.bereich = 'x'
AND
    (cl.cs_id = 31 OR cl.fd_id IS NULL)
ORDER BY
    sortierung
 
Zuletzt bearbeitet von einem Moderator:
Dann versuch mal die cl vor dem JOIN einzugrenzen
SQL:
SELECT
    *
FROM
    checklisten_felder cf 
    LEFT JOIN (
            SELECT *
            FROM checkliste
            WHERE cs_id = 31
        ) AS cl
    ON cf.fd_id = cl.fd_id
WHERE
    cf.bereich = 'x'
ORDER BY
    sortierung
 
vielen Dank, das hat geholfen.
Wobei ich zugeben muss das ich die Funktionsweise noch nicht ganz verstehe. ;)
 
vielen Dank, das hat geholfen.
Wobei ich zugeben muss das ich die Funktionsweise noch nicht ganz verstehe. ;)

Mit einem LEFT OUTER JOIN werden die Spalten der zweiten Tabelle zur ersten Tabelle gemerged, auch wenn diese gemäss der ON-Klausel nicht existieren, es werden also NULL-Werte gemerged! Wenn Du nun auf diese Attribute eine Einschränkung durchführst, wie z.B. mit cs_id = 31 gehen all diese Zeilen "verloren", der LEFT OUTER JOIN wird obsolet. Die hier gezeigte Lösung selektiert zuerst nur die cs_id = 31 und erst danach erfolgt der Merge.
 

Neue Beiträge

Zurück