Anmelden

View Full Version : sql mit 3 Dateien



Seiten : [1] 2

muadeep
31-01-06, 14:05
Hallo

will/muß per SQL eine Abfrage erstellen!

Anzeigedaten (Felder) für diese Abfrage kommen aus drei verschiedenen Dateien!

a.) BESTXXC
b.) TSSXX
c.) WARKTOXX

Für zwei Dateien funkt die Abfrage in etwa so:
SELECT a.lbtnr, a.lblief, a.lbramp, b.artbz, a.lbbet§, a.benumm
from yyy/BESTXXC a left join xxx/TSSXX b on (a.lbtnr =
b.artnr) order by a.lbtnr

will ich jetzt noch ein Feld (AKDATU) aus der dritten Datei (WARKTOXX) mit anzeigen, habe ich damit Probleme!

Verknüpfungsfelder aus Datei "a" und "c" sind:
a.BENUMM -> c.AUFKTO
a.BEPOS -> c.BELPOS

Wie muß ich das in der SELECT-Anweisung angeben, damit ich zu einem (richtigen) Ergebniss komme?

Fuerchau
31-01-06, 14:09
SELECT a.lbtnr, a.lblief, a.lbramp, b.artbz, a.lbbet§, a.benumm
from yyy/BESTXXC a
left join xxx/TSSXX b on a.lbtnr = b.artnr
left join xxx/WARKTOXX c on a.BENUMM = c.AUFKTO and a.BEPOS = c.BELPOS
order by a.lbtnr

der Join ist wie bei einer Where-Klausel zu definieren, Klammern werden nicht benötigt.
Du kannst das auch als Where definieren, dann ist es automatisch ein "inner join".

Du solltest dich auch entscheiden ob inner oder left, bei inner können NULL-Werte kommen.

B.Hauser
31-01-06, 14:15
Wie wär's damit:


SELECT a.lbtnr, a.lblief, a.lbramp, b.artbz, a.lbbet§, a.benumm, c.AKDATU
from yyy/BESTXXC a left join xxx/TSSXX b
on a.lbtnr = b.artnr
join MySchema/WARKTOXX c
on a.BENUMM = c.AUFKTO
and a.BEPOS = c.BELPOS
order by a.lbtnr


Birgitta

muadeep
31-01-06, 14:27
wenn ich folgende Anweisung benutzte:

SELECT a.lbtnr, a.lblief, a.lbramp, b.artbz, a.lbbet§, a.benumm, c.a
kdatu from yyy/bestxxc a left join xxx/tssxx b on a.lbtnr = b.a
rtnr join xxx/warktoxx c on a.benumm = c.aufkto and a.bepos = c.belpos order by a.lbtnr

dann bekomme ich nach einer etwas längeren Wartezeit diese
SQL-Fehlermeldung:

Zeichen in CAST-Argument ungültig

muadeep
31-01-06, 14:32
Zusatz:

Habe gerade festgestellt, das die beiden Felder a.BEPOS & c.BELPOS einmal num. (3,0) u. das andere char (3) ist !!!!!!!


kann es vieleicht daran liegen!

Fals ja, wie kann ich dieses Problem umgehen?

Fuerchau
31-01-06, 14:43
Ja, mit casting:
digits(a.bepos) = c.belpos

muadeep
31-01-06, 14:57
BINGO !!! -> dankeschön !!!

Wenn ich aber jetzt alle Sätze haben will (auch die, die nicht in
der zweiten bzw. dritten Datei eine entsprechendes "Gegenstück" haben)!

Wie wie muß ich das dann machen?


Mir ist leider immer noch nicht der Unterschied zwischen:
- join,
- left join,
- etc.

klar !!!!!!!

Kann mir jemand dazu vieliecht mal ne kurze "Hilfestellung" geben? (danke)

RobertPic
31-01-06, 15:56
Du solltest dich auch entscheiden ob inner oder left, bei inner können NULL-Werte kommen.


Räusper...Es ist genau anders herum...


BINGO !!! -> Mir ist leider immer noch nicht der Unterschied zwischen:
- join,
- left join,
- etc.

klar !!!!!!!

Kann mir jemand dazu vieliecht mal ne kurze "Hilfestellung" geben? (danke)

Ich mach mal ein paar Beispiele:

Datei Auftrag
AufNr KunNr Bstnr .....
1 10 b4711
2 11 b4712
3 12 b4713

Datei Liefadr (abweichende Lieferadresse)

AufNr Adresse
2 Wien

Kunden
Nr Name Adresse
10 Maier Graz
11 Hofer Linz
12 Schmidt München

Anforderung: Liste alle Aufträge mit der tatsächlichen Lieferadresse:

Der Klassiker:


select * from Auftrag, LiefAdr, Kunden where Auftrag.AufNr = LiefAdr.Aufnr and Auftrag.KunNr = Kunden.Nr


würde nur liefern:


Aufnr KunNr ... Liefadr.... Name Kunden.Adressse
2 11 Wien Hofer Linz


Dieser Select entspricht einem inner Join und könnte auch so geschrieben werden:



select * from Auftrag
inner join LiefAdr on Auftrag.Aufnr
inner join Kunden on Auftrag.KunNr = Kunden.Nr


Das Ergebnis wäre das Gleiche.

Ein Inner Join liefert nur dann einen Eintrag, wenn die Verknüpfung erfüllt ist.


Besser für diesen Fall: der LEFT OUTER JOIN



select * from Auftrag
LEFT OUTER join LiefAdr on Auftrag.Aufnr
LEFT OUTER join Kunden on Auftrag.KunNr = Kunden.Nr

würde liefern:



Aufnr KunNr ... Liefadr.... Name Kunden.Adressse
1 10 - Maier Graz
2 11 Wien Hofer Linz
3 12 - Schmidt München


Für die Darstellung von Null wird "-" verwendet.

Es geht aber besser:


select Auftrag.Aufnr, Auftrag.KunNr,
coalesce(Liefadr.Adresse, Kunden.Adresse) as Adresse, Name
* from Auftrag
LEFT OUTER join LiefAdr on Auftrag.Aufnr
LEFT OUTER join Kunden on Auftrag.KunNr = Kunden.Nr


Liefert:


Aufnr KunNr ... Adresse.... Name
1 10 Graz Maier
2 11 Wien Hofer
3 12 München Schmidt

Die Definition von coalesce (IBM-Welt value) lautet:
Liefert den erten Wert zurück, der nicht Null ist. Man könnte also die Null-Behandlung auch mit
coalesce(Liefadr.Adresse, ' ') as Adresse umgehen.

Bliebe noch der letzte Join, der Outer bzw. Exception Join:
Liefert nur Sätze von nicht erfolgreichen Verknüfpung zurück.



select * from Auftrag
exception join LiefAdr on Auftrag.Aufnr = LiefAdr.Aufnr


Würde die Aufträge 1 und 3 liefern, da es hier keine LiefAdr gibt.

Fuerchau
31-01-06, 16:00
Entschuldige, man kann sich ja mal vertun (tippfehler), aber es ist immer gut, weitere Fachleute zu haben.

loeweadolf
31-01-06, 16:37
Hier eine kleine Übersicht über Jpins:



http://www.muhmann.de/doku/1138725058sql_join.doc


mfg. Ludger