Einfach mal die F1-Hilfe zu FOR ALL ENTRIES IN itab lesen.
Das Verhalten, dass Duplikate entfernt werden, ist dokumentiert.
Dies ist neben dem ebenfalls dokumentierten, aber ohne Lesen der Doku erst mal unerwarteten Verhalten, dass bei leerer itab alles selektiert wird, egal, was es sonst noch an WHERE-Bedingungen gibt, der zweithäufigste Fehler, der bei SELECT ... FOR ALL ENTRIES IN gemacht wird. Weh tut das v.a., wenn man Betragsfelder selektiert, aber nicht alle Schlüsselfelder mit selektiert bzw. durch eindeutige Selektionsbedingung (bukrs EQ p_bukrs) ausschließt.
(Das wird auch im SAP-Standard gern mal falsch gemacht.)
Grund dafür, dass Duplikate aus der Ergebnismenge entfernt werden, ist, dass ein SELECT ... FOR ALL ENTRIES u.U. in mehrere SELECTs an die DB zerlegt wird (Gründe: Max. zulässige Größe eines SQL statements und/oder Profile-Parameter dafür, wie viele itab-EInträge maximal in einem SELECT an die DB zusammengefasst werden dürfen).
Und da SAP nicht erzwingt, dass die itab frei von Duplikaten sein muss, werden eben die Duplikate aus der Ergebnismenge entfernt.
Vorteil des SELECT ... FOR ALL ENTRIES ist, dass es nicht (wie bei SELECT-OPTIONS) zu einem Dump wegen Überschreiten der Maximalgröße eines SELECT-Statements kommt.
(Seit SAP-Basis 7.0 hat SAP die entsprechenden Puffer vergrößert, so dass man das Problem seltener hat.)
Weiterer Vorteil ist, dass man die Bedingungen für mehrere Felder zeilenweise verknüpfen kann.
Nachteil kann, insbesondere bei itabs mit vielen Einträgen und WHERE-Bedingung ohne passenden Index-Bezug, die im Vergleich zu SELECT-OPTIONS massiv schlechtere Laufzeit sein.
Denn während 200 Einträge einer SELECT-OPTION problemlos in ein SELECT-Statement passen, werden bei SELECT FOR ALL ENTRIES (bei Default-Konfiguration des Systems und ohne %_HINTS) etliche Statements an die DB abgesetzt.
Und wenn dann kein passender Index benutzt werden kann, kommt es eben statt zu einem Full Table Scan zu etlichen Full Table Scans.
Frank
Folgende Benutzer bedankten sich beim Autor Frank Dittrich für den Beitrag: Prego