View Full Version : sql left outer join
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
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.
Hallo.
An die SQL Profis :
wäre das nicht mal was für
FETCH FIRST 1 ROWS ONLY
Gruß,
Ralf
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
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.
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
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.
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.