Also ich muss zugeben, ich finde das Ergebnis von interbase gar nicht so schlecht. (Ist natürlich etwas schwammig) Bedeutet, alle anderen Ergebnisse finde ich auch eher falsch!
Ich kann mir vorstellen, dass es eigentlich nicht wirklich definiert ist, was da raus kommen soll, denn die gängigen Definitionen der Outer Joins betreffen ja erstmal die JOIN Kriterien untereinander. Hier ist das Kriterium erweitert und zwar als Filter, nicht als Join...
Hab mir jetzt nicht die Mühe gemacht, nach den
ANSI Definitionen zu suchen.
Ich muss aber andererseits auch sagen, ich würde nie auf die Idee kommen, ein solches Select Statement wie im P1 zu schreiben. Der Vorschlag von p80286 geht da in Richtung meiner Bedenken.
Die Left Join Condition für sich genommen, bringt ja erstmal kein Problem. Und die Erweiterung der Left Join Condition auf mehr Kriterien dient ja in der Regel dazu, auf elegante Art eine Filter für die rechte Seite anzugeben (unter Wahrung des gewollten Outer Effects > alle Datensätze der linken Seite werden angezeigt auch ohne passenden rechten Datensatz).
Wenn man LEFT JOIN so nutzen wollte, wie ich es verstehe, besonders bezogen auf den 2. Teil der jeweiligen JOIN Clause, dann würde man hier jeweils ein Kriterium angeben, das auch die "OUTER" Table betrifft und dann würde man das in P1 erwartete Ergebnis erhalten. Das Statement sähe so aus wie Uwe Raabe umformuliert hat.
Die in P1 dargestellten Selects wären m.E. analog zu:
PHP-Quellcode:
select t1.id as id1, t2.id as id2, t3.id as id3 from
test t1
left outer join test t2 on t2.id = t1.id
left outer join test t3 on t3.id = t1.id
where t1.id = 1
and t1.id = 1;
select t1.id as id1, t2.id as id2, t3.id as id3 from
test t1
left outer join test t2 on t1.id = t2.id
left outer join test t3 on t1.id = t3.id
where t1.id = 0
and t1.id = 0;
select t1.id as id1, t2.id as id2, t3.id as id3 from
test t1
left outer join test t2 on t1.id = t2.id
left outer join test t3 on t1.id = t3.id
where t1.id = 1
and t1.id = 0;
select t1.id as id1, t2.id as id2, t3.id as id3 from
test t1
left outer join test t2 on t1.id = t2.id
left outer join test t3 on t1.id = t3.id
where t1.id = 0
and t1.id = 1
Und damit wäre auch das
IB Ergebnis nicht ok...
Demokratisch gesehen sprechen einige
DB gegen das was ich schreibe. Ich bin aber auch nicht ganz auf der Seute von
IB. Dass es Ergebnis 2 als leere Menge darstellt, okay. Dass Ergebnis 3 ebenfalls leer ist, könnte man argumentieren, Ergebnis 4 ist dann aber inkonsistent zu 3.