AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Interbase: Merkwürdiges Verhalten bei LEFT OUTER JOIN
Thema durchsuchen
Ansicht
Themen-Optionen

Interbase: Merkwürdiges Verhalten bei LEFT OUTER JOIN

Ein Thema von HeZa · begonnen am 7. Apr 2020 · letzter Beitrag vom 14. Apr 2020
Antwort Antwort
Seite 1 von 2  1 2      
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Interbase: Merkwürdiges Verhalten bei LEFT OUTER JOIN

  Alt 7. Apr 2020, 17:19
Datenbank: Interbase • Version: 2017 • Zugriff über: IBDAC
Hallo,

ich verliere gerade ein bisschen den Glauben daran das Interbase in Bezug auf LEFT OUTER JOIN korrekt arbeitet. Folgendes Script
Code:
create table test (id int);

insert into test (id) values (1);

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 and t1.id = 1
  left outer join test t3 on t3.id = t1.id 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 t2.id = t1.id and t1.id = 0
  left outer join test t3 on t3.id = t1.id 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 t2.id = t1.id and t1.id = 1
  left outer join test t3 on t3.id = t1.id 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 t2.id = t1.id and t1.id = 0
  left outer join test t3 on t3.id = t1.id and t1.id = 1;

drop table test;
Erwarten würde ich, dass mir die 4 SELECTs folgendes Ergebnis liefern:
Code:
SELECT ID1, ID2, ID3
   1    1    1    1
   2    1   NULL NULL
   3    1    1   NULL
   4    1   NULL  1
Das ist zu mindestens auch das was ich auf der Seite SQL Fiddle für jede angebotene Datenbank erhalte. Interbase 2017 liefert mir nun folgendes Ergebnis:
Code:
SELECT ID1, ID2, ID3
   1    1    1    1
   2      <no row>
   3      <no row>
   4    1   NULL  1
Was ist hier los? Wie sieht das bei Firebird aus (reines interesse)? Die Zugrffskomponenten sind raus, ich habe das mit IBExpert (IBDAC) und SQL Workbench /J (JAVA) geteste. Beides mal das gleiche Ergebnis. Auch wenn man 3 verschiedene Tabellen nimmt, ändert sich nichts.

Kann da einer Licht in diese dunkle Stunde bringen?

Ciao HeZa
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 7. Apr 2020, 18:08
Das Verhalten finde ich zumindest auch merkwürdig. SQL-Server liefert das erwartete Ergebnis. Interbase 2020 kann ich auch nur mit dieser Version das erwünschte Ergebnis entlocken:
SQL-Code:
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 and t2.id = 1
  left outer join test t3 on t3.id = t1.id and t3.id = 1;

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 and t2.id = 0
  left outer join test t3 on t3.id = t1.id and t3.id = 0;

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 and t2.id = 1
  left outer join test t3 on t3.id = t1.id and t3.id = 0;

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 and t2.id = 0
  left outer join test t3 on t3.id = t1.id and t3.id = 1;
Ich finde, das sollte zumindest mal im QP gemeldet werden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#3

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

  Alt 7. Apr 2020, 18:09
FireBird 3.0 liefert das von Dir erwartete Ergebnis.

Getestet mit FlameRobin.

FlameRobin kann doch auch Interbase, wenn ich mich recht erinnere.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 7. Apr 2020, 18:59
Fb 3.0.5:
Miniaturansicht angehängter Grafiken
abfr2.jpg   abfr3.jpg  
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

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

  Alt 7. Apr 2020, 19:03
Wie wäre es mal Klammern zu setzen?
wenn
SQL-Code:
 test t1
  left outer join test t2 on t2.id = t1.id and t1.id = 1
  left outer join test t3 on t3.id = t1.id and t1.id = 0;
als
SQL-Code:
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 = 0 and and t1.id = 1;
interpretiert wird, kann ich das Ergebnis verstehen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
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
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

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

  Alt 8. Apr 2020, 11:35
Zitat:
Outer join syntax requires that you specify the type of join to perform. There are three possibilities:

A left outer join retrieves all rows from the left table in a join, and retrieves any rows from the right table that match the search condition specified in the ON clause.
Wenn man es genau liest, dann hat T1.ID=irgendwas an der angegebenen Stelle nichts zu suchen. Wenn andere DB damit klarkommen, sie sind halt anders.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 8. Apr 2020, 13:16
Ich denke auch, das ist interpretationsfähig. Eine klare Vorgabe das irgendwie umzusetzen kann ich auch nirgendwo finden.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#9

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

  Alt 8. Apr 2020, 13:48
Irgendwie ist mir eigentlich garnicht klar, was genau gewünscht ist.
SQL-Code:
create table test (id int);

insert into test (id) values (1);

create view v1_1 as select * from test t1 where t1.id = 1;
create view v1_0 as select * from test t1 where t1.id = 0;
create view v1_1_0 as select * from test t1 where t1.id = 1 or t1.id = 0;

select t1.id as id1, t2.id as id2, t3.id as id3 from
  v1_1 t1 -- mit der Beispieltabelle eigentlich eher sinnfrei
  left outer join test t2 on t2.id = t1.id
  left outer join test t3 on t3.id = t1.id; -- steht alles schon im ersten left ...

select t1.id as id1, t2.id as id2, t3.id as id3 from
  v1_0 t1 -- mit der Beispieltabelle eigentlich eher sinnfrei
  left outer join test t2 on t2.id = t1.id
  left outer join test t3 on t3.id = t1.id; -- steht alles schon im ersten left ...

select t1.id as id1, t2.id as id2, t3.id as id3 from
  v1_1_0 t1 -- mit der Beispieltabelle eigentlich eher sinnfrei
  left outer join test t2 on t2.id = t1.id
  left outer join test t3 on t3.id = t1.id; -- steht alles schon im ersten left ...

-- hier müsste man mit 'nem "drumgelegten" select ggfls. noch Sätze mit gleicher id1 zusammenfassen
-- sum, max ... und group by id1
select t1.id as id1, t2.id as id2, null as id3 from
  v1_1 t1
  left outer join test t2 on t2.id = t1.id
union
select t1.id as id1, null as id2, t3.id as id3 from
  v1_0 t1
  left outer join test t3 on t3.id = t1.id;

oder

oder

oder

...
Das Beispiel ist zwar geeignet um festzustellen, dass x und y zum gleichen Ergebnis kommen, während z was anders behauptet, aber es ist nicht geeignet um zu verifizieren ob überhaupt eines der Ergebnis der umzusetzenden Aufgabenstellung entspricht, geschweige denn nach sinnvollen und verifizierbaren Alternativen zu suchen.

Bitte einfach mal die Aufgabenstellung verbal beschreiben, dann können wir weitersehen, welche Lösungsmöglichkeiten existieren.
  Mit Zitat antworten Zitat
Heimlich

Registriert seit: 1. Apr 2020
11 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 8. Apr 2020, 15:56
Wie wäre es mal Klammern zu setzen?
Erstmal das erledigen.
Danach bitte noch dem LEFT OUTER JOIN mitteilen, dass es auch ein LEFT OUTER JOIN ist.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz