PDA

View Full Version : Bitte um Hilfe



Holzwurm1973
27-01-15, 16:00
Hallo liebe Forumsmitglieder,

wie im Titel schon erwähnt benötige ich Hilfe.
Aus der Wawi die auf der AS/400 läuft sollt ich eine Abfrage haben, aber ich komm nicht drauf.
Die Abfrage soll ALLE Reihen aus der Tabelle yku und telregyku verwenden auf die die Bedingungen der "Where Klausel" zutrifft unabhängig davon ob der Vergleichsschlüssel (kdnr) in der letzten Tabelle ykexe vorkommt oder nicht.
Jedoch wenn, muss geprüft werden ob euid='26' und ein='' ist nur dann darf aus der yku und der telregyku die Reihe verwendet werden.
Ich hoffe Ihr könnt mir folgen.

Anbei mal das was ich ausgeknobelt hab und nicht funktioniert.
Ich hoffe es kann mir jemand sagen wo mein Denkfehler ist.

select distinct
b.kdnr,b.Kuna1,b.kuna2,c.anrede,
c.vname, c.name, b.kustr, b.kuplz, b.kula, b.kuort, c.email, b.kuag,
b.kukogr,b.KURG,b.KUBETO, a.euid, a.ein
from yku b
join telregyku c on b.kdnr=c.kdnr
left join ykuexe a on ((a.ekdnr=b.kdnr and a.euid='26' and
a.ein<>'J') and (a.ekdnr is NULL and a.ein is NULL ))
join ykuexs d on b.kdnr=d.skdnr
where b.kulv ='' and c.email is not NULL and
b.kuag <> 'D1' and b.kulisp <> 'T' and d.suid='68'
and c.FUNKTI <> 'MARKET1' and c.FUNKTI <> 'AP7VW01'
order by b.kdnr

Vielen herzlichen Dank schon im voraus und einen schönen Abend

Fuerchau
27-01-15, 16:39
Das ist ja schon ein wenig unübersichtlich.
Aber die Beschreibung ist etwas falsch!?

Die YKUEXE soll unabhängig verwendet werden, also Left Join, aber gegen euid='26' und ein='' geprüft werden und nur dann wieder Daten aus den beiden Hauptdateien.
Dies entspricht nun wieder einem "Inner Join" und dann wird die Abfrage doch wieder übersichtlich.
Wenn aber die Daten aus YKU immer kommen soll, wenn in YKUEXE nichts ist so bleibt es bei dem Left Join.
Aber die On-Bedingungen im Left join (a.ekdnr is NULL and a.ein is NULL ) ist falsch bz. unnötig, da im Left join dies so nicht vorkommen kann, dies ist eher was für die Where-Klausel.

Ich denke da an folgendes

select *
from YKU b
inner join TELREGYKU c on b.kdnr = c.kdnr
left join YKUEXE a on b.kdnr = a.kdnr
inner join YKUEXS d on d.kdnr = a.kdnr

where b.kulv =''
and c.email is not NULL -- <= Ist das Feld mit NULL definiert?
and b.kuag <> 'D1'
and b.kulisp <> 'T'
and d.suid='68'
and c.FUNKTI <> 'MARKET1'
and c.FUNKTI <> 'AP7VW01'

and coalesce(a.euid, '26') = '26' -- <= Falls vorhanden dann muss 26, sonst nimm 26 an
and coalesce( a.ein, 'N') <>'J'

order by b.kdnr

Holzwurm1973
28-01-15, 06:09
Schönen guten morgen,

vielen Dank für die schnelle Antwort.
Im Feld "email" ist entweder ein Wert vorhanden oder eben NULL (leer).
Werd den Code mal testen und berichten.

Grüße

Holzwurm1973
28-01-15, 09:14
Hallo nochmal,

also ich hab den Code getestet - leider kommt nicht ganz das raus was ich mir wünsche.
Die Problematik an dem Ganzen ist wohl dass in der YKEXE die Verbindung (EKDNR) nicht unbedingt existiert.
vielleicht hab ich mich auch etwas unverständlich ausgedrückt :)

Nimm aus der YKU --> nimm aus der TELREGYKU alles was die selbe KDNR hat -->
nimm aus YKUEXS jene welche SUID='68' und die selbe KDNR wie YKU und TELREGYKU haben -->
schau nach ob EKDNR=KDNR in YKUEXE vorhanden und EUID='26' und EIN='' ansonsten bleib bei den bisherigen.

Und da liegt die Problematik, die Abfrage kehrt nicht zu den ersten beiden Dateien zurück.

Fuerchau
28-01-15, 10:36
Deine Beschreibung ist immer noch zu kompliziert.
Die YKUEXE wird per Left Join eingebunden, da dort Daten nicht vorhanden sein müssen.

Was soll "ansonsten bleib bei den bisherigen" denn bedeuten?

Meine Abfrage nimmt
- alles aus den ersten beiden Dateien, wenn in YKUEXE kein Satz existiert
- Nimm aus YKAU ff aber nur Daten, wenn ein Satz in YKUEXE vorhanden und euid='26' ist

Ein Left Join liefert immer NULL, wenn kein Satz vorhanden ist.
Coalesce berücksichtigt dies und meine Abfrage sagt dann, wenn in YKUEXE nichts ist, dann nimm in diesem Fall wieder EUID = '26' an um somit die Daten doch zu nehmen.

Mach doch einfach mal ein Datenbeispiel.

Die andere Möglichkeit ist, die Daten in 2 Schritten zu laden:

-- Teil 1 = alle Daten, die keinen Satz in YKUEXE haben
select *
from YKU b
inner join TELREGYKU c on b.kdnr = c.kdnr
inner join YKUEXS d on d.kdnr = a.kdnr

where b.kulv =''
and c.email is not NULL -- <= Ist das Feld mit NULL definiert?
and b.kuag <> 'D1'
and b.kulisp <> 'T'
and d.suid='68'
and c.FUNKTI <> 'MARKET1'
and c.FUNKTI <> 'AP7VW01'

and not exists (select * from YKUEXE a where b.kdnr = a.kdnr)

Union all
-- Teil 2 alle Kunden die einen Satz in YKUEXE haben und der Inhalt dort passt
select *
from YKU b
inner join TELREGYKU c on b.kdnr = c.kdnr
inner join YKUEXE a on b.kdnr = a.kdnr
inner join YKUEXS d on d.kdnr = a.kdnr

where b.kulv =''
and c.email is not NULL -- <= Ist das Feld mit NULL definiert?
and b.kuag <> 'D1'
and b.kulisp <> 'T'
and d.suid='68'
and c.FUNKTI <> 'MARKET1'
and c.FUNKTI <> 'AP7VW01'

and a.euid = '26'
and a.ein <>'J'

order by b.kdnr