PDA

View Full Version : SQL: JOIN mit prioritäten



h-net
04-05-09, 17:57
hallo,
ich habe ein meiner meinung nach in sql nicht lösbares problem, trozdem will ich dieses problem schildern einmal schidlern, vieleicht gibt es ja doch eine lösung.
erstmal ein beispiel:

SELECT * FROM tabelle1 a LEFT JOIN tabelle2 b ON (a.feld1 = b.feld1 AND a.feld2 = 'text1')die beiden tabellen sind ja über (a.feld1 = b.feld1 AND b.feld2 = 'text1') verknüpft.
jetzt könnte es aber sein, das er hierbei in der tabelle2 (b) keine einträge findet.
gibt es eine möglichkeit für den fall das er in tabelle2 nichts findet, nicht nach 'text1' sondern nach 'text2' abzufragen?
(sozusagen abfrageprioritäten zu verwalten "wenn nicht das, dann das")

ich hoffe das es eine lösung gibt(außer einen RIGHT JOIN daraus zu machen und mit zweiten SELECT per UNION zu verbinden)

vielen dank schonmal im vorraus
axel

BenderD
05-05-09, 08:06
wenn deine Tabelle1 einen primary key hat, müsste es mit coalesce und zwei subselects in der Where clause gehen,
select ... join ... an b.feld2 = coalesce ((select feld2 from tabelle1 i where a.key = i.key and feld2 = 'text1'), (select feld2 from ... and feld2 = 'text2'))
Das könnte man auch auflösen in zwei zusätzliche Joins.
Auch der Einsatz einer Function wäre denkbar.
Frei nach Theorie müsste es für die Query Engine zwar egal sein welche Variante man wählt, aber das ist einer der Fälle, wo ich da so meine Bedenken habe, ob das brummt. So eine ähnliche Struktur habe ich von einer mehrsprachigen Datenbank mit default Language in Erinnerung (nimm den Text in der Sprache des Benutzers, wenn das nicht geht, dann die Sprache der Applikation, wenn das auch nicht geht, dann die Default Language), das war letztlich dann funktional abgebildet am schnellsten, alles andere war fatal.

D*B



hallo,
ich habe ein meiner meinung nach in sql nicht lösbares problem, trozdem will ich dieses problem schildern einmal schidlern, vieleicht gibt es ja doch eine lösung.
erstmal ein beispiel:

SELECT * FROM tabelle1 a LEFT JOIN tabelle2 b ON (a.feld1 = b.feld1 AND a.feld2 = 'text1')die beiden tabellen sind ja über (a.feld1 = b.feld1 AND b.feld2 = 'text1') verknüpft.
jetzt könnte es aber sein, das er hierbei in der tabelle2 (b) keine einträge findet.
gibt es eine möglichkeit für den fall das er in tabelle2 nichts findet, nicht nach 'text1' sondern nach 'text2' abzufragen?
(sozusagen abfrageprioritäten zu verwalten "wenn nicht das, dann das")

ich hoffe das es eine lösung gibt(außer einen RIGHT JOIN daraus zu machen und mit zweiten SELECT per UNION zu verbinden)

vielen dank schonmal im vorraus
axel

Pikachu
05-05-09, 10:59
Oder vielleicht etwas verkürzt, in etwa so:

SELECT * FROM tabelle1 a LEFT OUTER JOIN tabelle2 b ON a.feld1=b.feld1 AND b.feld2 = (SELECT MIN(i.feld2) FROM tabelle2 i WHERE a.feld1= i.feld1 AND feld2 IN ('Text1', 'Text2'))

B.Hauser
05-05-09, 11:25
oder (vorausgesetzt, dass Text1 < Text2 ist und dass von Tabelle2 alle Spalten benötigt werden:



With x as (Select Fld1, Min(Fld2) MinFld2
from Tabelle2
where Fld2 in ('Text1', 'Text2')
Group By Fld1),
y as (Select a.*
from Tabelle2 a join x
on a.Fld1 = x.Fld1
and Fld2 = MinFld2)
Select *
from Tabelle1 z left outer join y
on z.Fld1 = y.Fld1


Birgitta