View Full Version : with und left outher join
Hallo zusammen
ich versuche ein (vereinfacht)
with a as (select ...),
b as (select ...)
select f1, f2, case when b.f3 is null then 0 else b.f3 end as f3
from C, a
left outer join b on c.feld = b.feld
where ...
aber er mag den join nicht
Wie kann ich das lösen?
Oder geht das und die Syntax ist an anderer Stelle defekt?
Danke Euch
Eine Mischung der unterschiedlichen Kodier-Methoden (Auflistung der Tabellen durch Komma getrennt mit Schlüssel in den Where-Bedingungen und Join-Methoden in der From-Anweisung) in der From-Anweisung wird nicht akzeptiert.
Da ich Deine Where-Bedingungen nicht sehe, verknüpfst Du hier die tabelle C über einen CROSS JOIN (karthesisches Produkt!!!) mit a und b.
Korrekt müsste es heißen:
With ...
Select ...
From C join a on ...
left outer join b on ...
Falls C,A nur ein falscher Fehler war, fällt C join a... weg und es bleibt:
From a left outer join b on ...
Birgitta
From c join a on ...
hat funktioniert, DANKE!!
Die Dokumentation läßt ... T1, T2 ... JOIN T3 ... aber zu (https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/db2/rbafzfromclause.htm), und STRSQL und STRQMQRY auf V5R4 können's auch.
Das muss aber nicht so bleiben.
Laut SQL-Standard gibt es nur entweder/oder. Und was mit V5R4 ging muss ja nicht so bleiben wenn es ein Fehler bzw. nicht Standard ist.
Die SQL-Empfehlung ist eigentlich immer mit Join zu arbeiten.
Quelle ?
Laut SQL-Standard gibt es nur entweder/oder.
soweit ich das sehe, kann man in der from clause von der ersten ANSI Spezifikation (SQL 89) eine Liste von Tabellen, Views, Ausdrücken die ein ResultSet liefern angeben. Das wird dann als Cross join interpretiert, der in der where clause eingegrenzt werden kann.
Mit SQL 92 sind dann die ersten join Konstrukte dazugekommen. Die sind gemeint, wenn man von ANSI join spricht.
Die old style Variante existiert nebenher und wird es wohl auch weiterhin tun.
Der Mix aus old style und ANSI ist durchaus legal und geht auch unter V7 noch.
(select *
from
sysibm.sysdummy1 a
, sysibm.sysdummy1 b
join sysibm.sysdummy1 c on 1 = 1)
Ich bin immer für Einfachheit und Klarheit und empfehle die ANSI join Form. (Beide nebeneinander zu verwenden ist nur was für Leute, die Gürtel und Hosenträger tragen.)
- ANSI join kann alles, was old style kann
- old style kann nicht alles, was ANSI kann
=> ANSI join ist der Weg!
Was die Quellen angeht: Leider ist an die offiziellen ANSI SQL Dokus offiziell nur gegen größere Mengen Geldes zu kommen.
D*B
In deinem Link finde ich aber genau diese Definition nicht.
Entweder "a, b, c" oder "a join b join c".
V5R4 war ja auch vor (gefühlten) 20 Jahren.
Ich meine Birgitta hat dazu mal irgendwo den Link mit entweder/ohne.
Das Problem dürfte die inzwischen erhebliche Komplexität der Join-Möglichkeiten sein die eine Kombination der Alt- und Neuvariante nicht mehr zulässt.
Aber ist es letztlich nicht egal wo es steht, wenn der Syntaxprüfer es einfach nicht mehr zulässt?
In deinem Link finde ich aber genau diese Definition nicht.
Entweder "a, b, c" oder "a join b join c".
V5R4 war ja auch vor (gefühlten) 20 Jahren.
... das ist nur die falsche Stelle. Auf Seite 711 der SQL Reference V7R3 ist das erweiterte Syntax Diagramm für den mix zwischen old style und ANSI SQL join und gehen tut das auch.
Steht aber drin:
FROM table-reference, table-reference, ...
table-reference kann unter anderem sein: joined-table
joined-table ist z.B.: table-reference join table-reference on ...
Egal ist es nicht, es könnte ja ein Fehler im Syntaxprüfer sein. :-)
In deinem Link finde ich aber genau diese Definition nicht.
Entweder "a, b, c" oder "a join b join c".
...
Aber ist es letztlich nicht egal wo es steht, wenn der Syntaxprüfer es einfach nicht mehr zulässt?