Einzelnen Beitrag anzeigen

jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Interbase: Merkwürdiges Verhalten bei LEFT OUTER JOIN

  Alt 8. Apr 2020, 00:58
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.
Gruß, Jo
  Mit Zitat antworten Zitat