Discussion:
left join mit bedingngung in der rechten tabelle?
(zu alt für eine Antwort)
Leif Eickhoff
2006-03-25 09:13:59 UTC
Permalink
hallo,
ich habe gestern zu ersten mal mit left joins gearbeitet und meine frage ist
daher vermutlich banal. ich habe aber in google nichts dazu gefunden,
wahrscheinlich deshalb, weil mir der passende suchgegriff fehlt.

zu meiner frage:

ich möchte einen left join uber zwei tabellen machen, jedoch eine bedingung
einfügen die sich auf die rechte tabelle bezieht. laut meiner referenz wird
bei einer nicht zutreffenden zeile eine zeile mit NULL werten zum join mit
der linken tabelle verwendet.
daher habe ich mir gedacht das es so vielleicht funktionieren könnte:

SELECT * FROM links LEFT JOIN rechts WHERE links.ID=rechts.ueberID AND
(rechts.aktiv='1' OR rechts.aktiv=NULL)

leider liefert die abfrage nur zeilen in denen rechts.aktiv='1' zutrifft.
gibt es eine methode die bedingung "WHERE rechts.aktiv='1'" beizubehalten,
aber trotzdem auch die datensätze abzurufen für die kein eintrag in der
rechten tabelle existiert?

vielen dank!
gruß leif
Kai Ruhnau
2006-03-25 09:21:37 UTC
Permalink
Leif Eickhoff wrote:
[snip]
Post by Leif Eickhoff
SELECT * FROM links LEFT JOIN rechts WHERE links.ID=rechts.ueberID AND
(rechts.aktiv='1' OR rechts.aktiv=NULL)
leider liefert die abfrage nur zeilen in denen rechts.aktiv='1' zutrifft.
gibt es eine methode die bedingung "WHERE rechts.aktiv='1'" beizubehalten,
aber trotzdem auch die datensätze abzurufen für die kein eintrag in der
rechten tabelle existiert?
Die Syntax um einen NULL-Wert abzufragen ist eine andere:

OR rechts.aktiv IS NULL

Grüße
Kai
--
This signature is left as an exercise for the reader.
Leif Eickhoff
2006-03-25 10:19:33 UTC
Permalink
Post by Kai Ruhnau
OR rechts.aktiv IS NULL
Grüße
Kai
problem gelöst, vielen dank!
Axel Schwenke
2006-03-25 11:40:01 UTC
Permalink
Post by Kai Ruhnau
Post by Leif Eickhoff
SELECT * FROM links LEFT JOIN rechts WHERE links.ID=rechts.ueberID AND
(rechts.aktiv='1' OR rechts.aktiv=NULL)
OR rechts.aktiv IS NULL
Die gebräuchlichere Lösung ist, die Bedingung für die rechte Tabelle
mit in die JOIN-Bedingung zu ziehen:

SELECT ...
FROM links LEFT JOIN rechts
ON (links.ID = rechts.ueberID AND rechts.aktiv = 1)


XL
Dieter Noeth
2006-03-25 18:30:32 UTC
Permalink
Post by Axel Schwenke
Post by Kai Ruhnau
Post by Leif Eickhoff
SELECT * FROM links LEFT JOIN rechts WHERE links.ID=rechts.ueberID AND
(rechts.aktiv='1' OR rechts.aktiv=NULL)
OR rechts.aktiv IS NULL
Die gebräuchlichere Lösung ist, die Bedingung für die rechte Tabelle
SELECT ...
FROM links LEFT JOIN rechts
ON (links.ID = rechts.ueberID AND rechts.aktiv = 1)
Wieso "gebräuchlicher", wenn die beiden Abfragen unterschiedliche
Ergebnisse liefern?

Dieter
Axel Schwenke
2006-03-26 01:42:17 UTC
Permalink
Post by Dieter Noeth
Post by Axel Schwenke
Post by Kai Ruhnau
Post by Leif Eickhoff
SELECT * FROM links LEFT JOIN rechts WHERE links.ID=rechts.ueberID AND
(rechts.aktiv='1' OR rechts.aktiv=NULL)
OR rechts.aktiv IS NULL
Die gebräuchlichere Lösung ist, die Bedingung für die rechte Tabelle
SELECT ...
FROM links LEFT JOIN rechts
ON (links.ID = rechts.ueberID AND rechts.aktiv = 1)
Wieso "gebräuchlicher", wenn die beiden Abfragen unterschiedliche
Ergebnisse liefern?
Tun sie das? Vielleicht bin ich ja blind, aber soweit ich das über-
blicke, liefern beide Queries das gleiche Ergebnis. Obwohl, ich sehe
gerade, wenn rechts.aktiv NULL sein darf, dann vielleicht auch nicht.

Ich habe das Problem des OP so verstanden, daß er beim LEFT JOIN
einen Filter auf der rechten Tabelle haben will. Der gebräuchliche
Weg ist dann, den Filter in die JOIN-Bedingung aufzunehmen.


XL
Dieter Noeth
2006-03-26 10:02:53 UTC
Permalink
Post by Axel Schwenke
Post by Dieter Noeth
Post by Axel Schwenke
Die gebräuchlichere Lösung ist, die Bedingung für die rechte Tabelle
SELECT ...
FROM links LEFT JOIN rechts
ON (links.ID = rechts.ueberID AND rechts.aktiv = 1)
Wieso "gebräuchlicher", wenn die beiden Abfragen unterschiedliche
Ergebnisse liefern?
Tun sie das? Vielleicht bin ich ja blind, aber soweit ich das über-
blicke, liefern beide Queries das gleiche Ergebnis. Obwohl, ich sehe
gerade, wenn rechts.aktiv NULL sein darf, dann vielleicht auch nicht.
Wenn eine Suchbedingung im ON steht, dann ist es eine Join-Bedingung:
Wenn die nicht TRUE wird, dann werden die Rows trotzdem zurückgeliefert.
Das Ergebnis sind also *alle* Rows aus der linken Tabelle, wobei die mit
"rechts.aktiv <> 1" geNULLt sind.

Mit "(rechts.aktiv = 1 OR rechts.aktiv IS NULL) gibt es nur die Rows aus
der linken Tabelle, die "rechts.aktiv = 1" haben oder kein Gegenstück haben.

linke rows: 1,2,3
rechte rows: 1,2

Join-Bedingung AND rechte_spalte = 1
-> (1,1), (2,NULL), (3,NULL)

Join-Bedingung WHERE (rechte_spalte = 1 or rechte_spalte IS NULL)
-> (1,1), (3,NULL)
Post by Axel Schwenke
Ich habe das Problem des OP so verstanden, daß er beim LEFT JOIN
einen Filter auf der rechten Tabelle haben will.
Sah eher so aus, als ob er einen Filter auf die Ergebnismenge wollte...

Dieter
Axel Schwenke
2006-03-26 11:35:50 UTC
Permalink
Post by Dieter Noeth
Post by Axel Schwenke
Tun sie das? Vielleicht bin ich ja blind, aber soweit ich das über-
blicke, liefern beide Queries das gleiche Ergebnis. Obwohl, ich sehe
gerade, wenn rechts.aktiv NULL sein darf, dann vielleicht auch nicht.
Wenn die nicht TRUE wird, dann werden die Rows trotzdem zurückgeliefert.
Das Ergebnis sind also *alle* Rows aus der linken Tabelle, wobei die mit
"rechts.aktiv <> 1" geNULLt sind.
Mit "(rechts.aktiv = 1 OR rechts.aktiv IS NULL) gibt es nur die Rows aus
der linken Tabelle, die "rechts.aktiv = 1" haben oder kein Gegenstück haben.
OK. Ich bin also zumindest manchmal blind ;-)
Post by Dieter Noeth
Post by Axel Schwenke
Ich habe das Problem des OP so verstanden, daß er beim LEFT JOIN
einen Filter auf der rechten Tabelle haben will.
Sah eher so aus, als ob er einen Filter auf die Ergebnismenge wollte...
Da der OP in seiner Query nicht zwischen JOIN- und WHERE-Bedingung
unterscheidet, werden wir das nur raten können. Die Prosa ist aber
Post by Dieter Noeth
Post by Axel Schwenke
Post by Leif Eickhoff
ich möchte einen left join uber zwei tabellen machen, jedoch eine
bedingung einfügen die sich auf die rechte tabelle bezieht.
Vielleicht äußert *er* sich ja mal dazu.


XL

Loading...