PDA

View Full Version : sql left outer join



Seiten : [1] 2

dibe
22-09-15, 08:54
Guten Morgen,

Ich habe eine führende Datei A und eine "nicht immer vorhandene" Datei B

Leider gibt es Fälle in denen der Key in Datei B doppelt vorhanden ist.

Bei 10 Sätzen in Datei A bekomme ich 12 Sätze durch den select, obwohl mit dem Key aus Datei A nur 7 passende Sätze in Datei B sind. Diese aber mehrfach.

select * from DateiA left outer join DateiB on a.key = b.key

ich möchte quasi ein

select * from DateiA left outer join DateiB on a.key = max(b.key) group by b.key
Das geht aber nicht.

Wer kann mir helfen,
Danke!

andreaspr@aon.at
22-09-15, 09:03
Du müsstest dafür ein Subselect von DateiB machen ...

[CODE]With B as (Select Key, Feld1, Feld2, ... from DateiB Groupb By Key)
Select * From from DateiA a left outer join B on a.key = b.key[/CODE

lg Andreas

Fuerchau
22-09-15, 09:38
Wenn a.key = b.key dann ist a.key = max(b.key)!
Das hilft dir so also nicht.
Du benötigst ein zusätzliches Kriterium um den letzten Satz aus DateiB zu ermitteln.

TheDevil
22-09-15, 10:39
Hallo.
An die SQL Profis :
wäre das nicht mal was für
FETCH FIRST 1 ROWS ONLY
Gruß,
Ralf

hel400
22-09-15, 10:40
Wenn Du kein zusätzliches Kriterium hast, dann kannst Du Dir mit der RRN behelfen:

select * from DateiA a left join DateiB b on a.feld1=b.feld1
where rrn(b) in (select max(rrn(DateiB)) from DateiB group by feld1)
or rrn(b) is null

Fuerchau
22-09-15, 12:14
Für rrn(x) existiert glaube ich erst ab V7R1 ein Pseudoindex, ansonsten kann das langsam sein.
"Fetch first 1 rows only" klappt im skalaren Subselect.
Ob das auch im "Left Join (select * from file fetch first 1 records only) b on a.key = b.key" sinn macht, wage ich zu bezweifeln.

dibe
22-09-15, 13:06
erst mal vielen Dank

ich habe nun diese Version, gewählt
select * from DateiA A left outer join (select distict f1, f2, f3, ... from DateiB) B on A.key = B.key

das funktioniert richtig

Danke
Gruß
DiBe

Fuerchau
22-09-15, 13:19
Das ist eher unüblich und würde bedeuten, dass du in DateiB vollkommen doppelte Daten hast.
Außerdem ist dies nun nicht besonders schnell, da du Indexzugriffe auf DateiB ggf. verhinderst.

dibe
22-09-15, 15:06
Nun ja, bis auf die letzten 4 Felder (die mich nicht interessieren) sind in der Datei tatsächlich alle gleich.
Performance spielt hier nicht die Rolle, eher die Lösung an sich ...

KingofKning
20-01-16, 08:50
Hallo *all,
wer zerschlägt dann mal den gordischen Knoten in meinem neuronalen Netz.

Habe hier einen Kundenstamm und dazu eine Auftragsdatei.
Ich möchte jetzt zu der Auftragsdatei jeweils den letzten Auftragssatz nach Datum haben.


Abfrage:



select t01.adkto, max(t02.akkdtl), t02.akanr from
adr01pf t01 left join ako01pf t02
on t01.adkto = t02.akkto
where adfa = 1
and adsts = 0
and akkdj1 = 1
and (akkdtl > 150101 and akkdtl < 990000)
group by adkto, akanr, akkdtl
order by adkto, akkdtl



Ergebnis:
nummer Nr.


1001 150.422 149326
1001 150.914 150209
1006 150.128 563217
1006 150.428 563933
1009 151.008 564651


Aber irgendwas ist ja noch falsch, sonst würde die Kunden 1001 nicht zweimal auftauchen.