PDA

View Full Version : SQL FULL JOIN



fpxx
10-09-07, 10:01
Hallo Forumsteilnehmer,

ich möchte mit SQL 2 Dateien verbinden und dabei auch diejenigen Datensätze der Primärdatei in der Ergebnisliste haben, die nicht mit der Sekundärdatei verknüpfbar sind.

Ich habe daher versucht, auf einer AS400 (Rel. V5R3M0) den Befehl
select feld1, feld2 from FILEA FULL JOIN FILE2 ON feld1=feldx etc.
dafür zu verwenden.

Ich bekomme die Antwort "TOKEN FULL" ungültig.

Ist FULL JOIN auf der AS400 nicht unterstützt bzw. welche anderen (einfachen) Möglichkeiten gibt es dafür.

Ich danke euch für euer Infos.

KM
10-09-07, 10:19
Wie wäre es mit LEFT OUTER JOIN ?

Gruß,
KM

fpxx
10-09-07, 10:41
Danke für die Info,

ohne WHERE-Klausel funktionierts.

Wenn ich aber in der WHERE-Klausel eine Abfrage Feld Datei A <> Feld Datei B definiere, dann fallen die Datensätze wo die Verknüpfung wegen fehlender Sätze in Datei B nicht erfolgen kann, aus meiner Ergebnisliste heraus.
zb. Feld Datei A=100; kein verknüpfbarer Satz in Datei B; dann müsste dieser Datensatz doch in der Liste enthalten sein,oder?

Dh. SQL INNER LEFT JOIN reagiert anders als zB. bei QUERY, wenn ich die Verknüpfungs-Art "2" (mit Primärdatei gleiche Sätze) auswähle.

Ich danke im voraus.

B.Hauser
10-09-07, 11:20
Hallo,

bei Query/400 und Verknüpfung mit Primär-Datei gleich, werden für die nicht gefundenen Sätze in der zweiten Datei Default-Werte (z.B. 0 oder *Blanks) ausgegeben.

Bei Left Outer Join werden für die Felder in der zweiten Datei, die nicht verknüpft wurden NULL-Werte ausgegeben.
NULL-Werte sind Werte außerhalb des gültigen Bereichs und können deshalb nicht über die üblichen Vergleichsoperatoren (=, <>) abgefragt werden. Statt dessen muss IS NULL bzw. IS NOT NULL verwendet werden.

Wenn Du allerdings nur die Sätze ermitteln willst, für die es in der zweiten Seite kein Pendant gibt, würde ich über EXCEPTION JOIN (entspricht mit Primärdatei ungleich in Query/400) verknüpfen.

Birgitta

fpxx
10-09-07, 11:44
Besten Dank, Brigitta.
Die Erklärung mit den NULL-Inhalten hat es mir verständlich gemacht.
Für meine Auswertung brauche ich zwar eine Abfrage, aber ich werd schon was finden.

Danke und einen schönen Tag noch

Fuerchau
10-09-07, 11:53
Du musst dann z.B. folgendes abfragen:

a.feld=100 and b.feld is null

Sobald du aus Datei B einen festen Wert abfragst, generierst du automatisch einen Inner Join.

Wenn du also sowohl als auch benötigst gibts nur folgendes:

a.feld=100 and (b.feld is null or a.feld<>b.feld)

BenderD
10-09-07, 15:27
Hallo,

coalesce ist dein Freund
select coalesce(irgendEinNumerischesFeld, 0), coalesce(irgendEinAlfaFeld, " ") ...
from ... left outer join ...
sollte es tun, wenn du die coalesce Funktion (liefert den ersten Wert aus der Liste, der nicht null ist) um alle Felder der zweiten Datei drumherum baust.

mfg

Dieter Bender



Besten Dank, Brigitta.
Die Erklärung mit den NULL-Inhalten hat es mir verständlich gemacht.
Für meine Auswertung brauche ich zwar eine Abfrage, aber ich werd schon was finden.

Danke und einen schönen Tag noch

Fuerchau
10-09-07, 16:32
@Dieter
Dann musst du allerdings auch die Where-Klausel ergänzen:

where ... coalesce(...) = Wert ...

sonst klappt das wieder nicht.

BenderD
10-09-07, 16:46
Hallo,

normalerweise würde ich das im View Layer, oder als common table expression oder als geschachtelte Hugo Abfrage machen:
create view ddd as select ...

oder with a as (select ...)
select * from a where ...

oder select * from (select ...) hugo where ...

mfg

Dieter Bender


@Dieter
Dann musst du allerdings auch die Where-Klausel ergänzen:

where ... coalesce(...) = Wert ...

sonst klappt das wieder nicht.