-
sql mit 3 Dateien
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?
-
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.
-
Wie wär's damit:
PHP-Code:
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
-
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
-
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?
-
Ja, mit casting:
digits(a.bepos) = c.belpos
-
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)
-
Zitat von Fuerchau
Du solltest dich auch entscheiden ob inner oder left, bei inner können NULL-Werte kommen.
Räusper...Es ist genau anders herum...
Zitat von muadeep
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:
PHP-Code:
select * from Auftrag, LiefAdr, Kunden where Auftrag.AufNr = LiefAdr.Aufnr and Auftrag.KunNr = Kunden.Nr
würde nur liefern:
PHP-Code:
Aufnr KunNr ... Liefadr.... Name Kunden.Adressse 2 11 Wien Hofer Linz
Dieser Select entspricht einem inner Join und könnte auch so geschrieben werden:
PHP-Code:
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
PHP-Code:
select * from Auftrag LEFT OUTER join LiefAdr on Auftrag.Aufnr LEFT OUTER join Kunden on Auftrag.KunNr = Kunden.Nr
würde liefern:
PHP-Code:
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:
PHP-Code:
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:
PHP-Code:
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.
PHP-Code:
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.
-
Entschuldige, man kann sich ja mal vertun (tippfehler), aber es ist immer gut, weitere Fachleute zu haben.
-
Hier eine kleine Übersicht über Jpins:
http://www.muhmann.de/doku/1138725058sql_join.doc
mfg. Ludger
-
meine SQL - Anweisung müsste dann in etwa so lauten (denke ich mal):
PHP-Code:
SELECT
a.LBTNR, a.LBLIEF, a.LBRAMP, b.ARTBZ, a.LBBET§, a.BENUMM, c.AKDATU
FROM yyy/BESTXXC a
LEFT OUTER JOIN xxx/TSSXX b ON a.LBTNR = b.ARTNR
LEFT OUTER JOIN xxx/WARKTOXX c ON a.BENUMM = c.AUFKTO AND DIGITS(a.BEPOS) = c.BELPOS
ORDER BY a.LBTNR
Mit dieser Anweisung erhalte ich dann aber "33266"-Sätze
-> in der Datei (a) BESTMXXC sind aber nur "32781"
woher kommen dann die zusätzlich 485 Sätze ?!?!?!?
-
Sind vielleicht in einer der left join dateien für den Zugriffsschlüssel mehr als 1 Satz vorhanden ?
Z.b.
1 Header Satz mit 3 Detail Sätzen per left join verknüpft = 3 Sätze, obwohl im Header nur 1 Satz ist.
Ansonsten kann man sich die joins übrigens auch sehr gut als Schnittmenge vorstellen...
A Inner join B = Element ist in A und B vorhanden
A left join B = Element ist in A, wenn es in B vorhanden ist wird b mitselektiert, sonst kommen NULL Werte
A Exception Join B = Element ist in A aber nicht in B
Gruß
Rince
Similar Threads
-
By mk in forum NEWSboard Programmierung
Antworten: 13
Letzter Beitrag: 13-07-12, 08:53
-
By moskito in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 30-08-06, 17:30
-
By steven_r in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 08-08-06, 09:34
-
By desti82 in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 04-07-06, 15:25
-
By mikex01 in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 21-04-06, 16:11
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks