ich habe eine wahrscheinlich recht einfache Frage, die ich aber irgendwie grad nicht richtig gelöst bekomme:
Ich habe in einem Programm 2 itabs.
Die eine (itab_gross) ist sehr groß (ca. 20 Spalten und 1 Mio. Zeilen), die andere (itab_klein) sehr klein (2 Spalten und rund 30-50 Zeilen).
In beiden itabs gibt es das Schlüsselfeld VKONT.
Nun möchte ich aus der itab_gross alle Einträge löschen, in denen das Feld VKONT mit dem selben Wert im Feld VKONT der itab_klein gefüllt ist.
Sprich: In der itab_groß sind 1 Mio. Einträge mit 1 Mio. verschiedenen Werten in VKONT und in der itab_klein gibt es z.B. 10 Einträge, in denen das Feld VKONT den selben Wert hat wie in der itab_groß. Diese Einträge sollen nun aus der itab_gross gelöscht werden.
Ich tue mich irgendwie schwer damit, über die itab_groß zu loopen und für jeden Eintrag zu prüfen, ob es einen entsprechenden Eintrag in der itab_klein gibt.
Was könnt ihr Profis mir empfehlen, wie ich das Prüfen und Löschen aufbauen sollte, dass die Performance noch einigermaßen akzeptabel ist?
Ohne es zu prüfen, würde mir einfallen, die kleine IT_TAB in eine Range-Tabelle zu packen.
lt_vkonto_range type range of vkont_kk.
Un dann mit einem DELETE und IN zu löschen. Weiß aber nicht, ob DELETE mit IN umgehen kann.
Also:
DELETE itab_gross where vkont IN lt_vkonto_range.
--
Oder du sortierst die große Tabelle nach VKONT als Sorted Tabelle.
Dann machts du ein LOOP über die kleine.
Am Ende dann
DELETE itab_gross WHERE VKONT = <wa_vkont>.
--
Kann sein, dass du das Sort auch in meinem ersten Vorschlag brauchst. Kann nämlich sein, dass der IN-Operator auch nur sequenziell für jeden Eintrag in der RANGE über die große Tabelle BIS ZUM ENDE Loop und dann löscht. Wenn sie sortiert ist, geht die Suche schneller.