left join mit bedingngung in der rechten tabelle?

left join mit bedingngung in der rechten tabelle?

am 25.03.2006 10:13:59 von Leif Eickhoff

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

Re: left join mit bedingngung in der rechten tabelle?

am 25.03.2006 10:21:37 von Kai Ruhnau

Leif Eickhoff wrote:
[snip]
> 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.

Re: left join mit bedingngung in der rechten tabelle?

am 25.03.2006 11:19:33 von Leif Eickhoff

> OR rechts.aktiv IS NULL
>
> Grüße
> Kai

problem gelöst, vielen dank!

Re: left join mit bedingngung in der rechten tabelle?

am 25.03.2006 12:40:01 von Axel Schwenke

Kai Ruhnau wrote:
> Leif Eickhoff wrote:

>> SELECT * FROM links LEFT JOIN rechts WHERE links.ID=rechts.ueberID AND
>> (rechts.aktiv='1' OR rechts.aktiv=NULL)
>
> Die Syntax um einen NULL-Wert abzufragen ist eine andere:
>
> 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

Re: left join mit bedingngung in der rechten tabelle?

am 25.03.2006 19:30:32 von dnoeth

Axel Schwenke wrote:

>>>SELECT * FROM links LEFT JOIN rechts WHERE links.ID=rechts.ueberID AND
>>>(rechts.aktiv='1' OR rechts.aktiv=NULL)
>>
>>Die Syntax um einen NULL-Wert abzufragen ist eine andere:
>>
>>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)

Wieso "gebräuchlicher", wenn die beiden Abfragen unterschiedliche
Ergebnisse liefern?

Dieter

Re: left join mit bedingngung in der rechten tabelle?

am 26.03.2006 03:42:17 von Axel Schwenke

Dieter Noeth wrote:
> Axel Schwenke wrote:
>
>>>>SELECT * FROM links LEFT JOIN rechts WHERE links.ID=rechts.ueberID AND
>>>>(rechts.aktiv='1' OR rechts.aktiv=NULL)
>>>
>>>Die Syntax um einen NULL-Wert abzufragen ist eine andere:
>>>
>>>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)
>
> 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

Re: left join mit bedingngung in der rechten tabelle?

am 26.03.2006 12:02:53 von dnoeth

Axel Schwenke wrote:

>>>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)
>>
>>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)

> 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

Re: left join mit bedingngung in der rechten tabelle?

am 26.03.2006 13:35:50 von Axel Schwenke

Dieter Noeth wrote:
> Axel Schwenke wrote:
>
>> 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.

OK. Ich bin also zumindest manchmal blind ;-)

>> 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
IMHO eindeutig:

>>>> 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