Wir wissen jetzt, wie wir die Daten richtig selektieren, welche Tabellenart wir bei Lookups nutzen sollten und wie wir sicherstellen können, dass wir nur relevante Datensätze durchlesen.
In der Praxis ist es aber oft so, dass man erstmals eine größere und/oder nicht eindeutige Datenmenge von der Datenbank selektieren muss, die dann nach bestimmten Regeln fürs performante Nachlesen aggregiert werden sollte.
Abhängig vom Aggregationsverfahren wird unterschiedlich vorgegangen. Beim Summieren, Errechnen des Zählers oder des Durchschnitts muss man i. d. R. durch jeden Datensatz der internen Tabelle schleifen. Beim Ermitteln des Minimal- bzw. Maximalwertes geht es aber auch schneller. Dafür muss man die erhaltenen Datensätze sortieren und daraufhin mit der Anweisung DELETE ADJACENT DUPLICATES bereinigen. Dabei hat man die Möglichkeit, mittels des Zusatzes COMPARING zu bestimmen, welche Felder für den Vergleich berücksichtigt werden sollen.
Dies wird anhand des folgenden Beispiels verdeutlicht. Wir haben eine Datenquelle dbTab. Diese beinhaltet unter anderem 3 Schlüsselfelder, ein Lookup-Feld zum Nachlesen und ein Datumsfeld. Unser Ziel ist es, den Lookup-Wert nur für den letzten, aktuellsten Datensatz zu selektieren, damit wir diesen später performanter nachlesen können.
Zuerst selektieren wir alle o. g. Felder aus dbTab, für die eine entsprechende Schlüsselkombination in unserem result_package vorhanden ist.
SELECT key_field1 key_field2 key_field3 date_field lookup_field FROM dbTab INTO TABLE iTab FOR ALL ENTRIES IN result_package WHERE key_field1 = result_package-key_field1 AND key_field2 = result_package-key_field2 AND key_field3 = result_package-key_field3
Hiermit haben wir mehrere Datumsfelder pro Schlüsselfeld, wobei wir nur das aktuellste benötigen.
key_field | key_field2 | key_field3 | date_field | lookup_field |
A | B | C | 20170101 | 1 |
B | C | D | 20170101 | 2 |
C | D | E | 20170101 | 3 |
A | B | C | 20170301 | 4 |
B | C | D | 20170301 | 5 |
C | D | E | 20170301 | 6 |
A | B | C | 20170501 | 7 |
B | C | D | 20170501 | 8 |
C | D | E | 20170501 | 9 |
Ganz wichtig ist es, die Ergebnistabelle zu sortieren, da sonst DELETE ADJACENT DUPLICATES nicht funktionieren würde.
SORT iTab BY key_field1 ASCENDING key_field2 ASCENDING key_field3 ASCENDING date_field DESCENDING
Somit haben wir sichergestellt, dass die interne Tabelle iTab so aussieht.
key_field | key_field2 | key_field3 | date_field | lookup_field |
A | B | C | 20170501 | 7 |
A | B | C | 20170301 | 4 |
A | B | C | 20170101 | 1 |
B | C | D | 20170501 | 8 |
B | C | D | 20170301 | 5 |
B | C | D | 20170101 | 2 |
C | D | E | 20170501 | 9 |
C | D | E | 20170301 | 6 |
C | D | E | 20170101 | 3 |
Nach der Anweisung DELETE ADJACENT DUPLICATES bleiben dann nur die relevanten Datensätze übrig und wir können uns auf ein performantes Nachlesen dieser Datensätze freuen. :)
DELETE ADJACENT DUPLICATES FROM iTab COMPARING key_field1 key_field2 key_field3 date_field.
key_field | key_field2 | key_field3 | date_field | lookup_field |
A | B | C | 20170501 | 7 |
B | C | D | 20170501 | 8 |
C | D | E | 20170501 | 9 |