PDA

View Full Version : verschachteltes SQL



Armin
31-05-07, 10:26
Hallo Leut, ich glaub ich sitz einem Systemfehler auf?!

Aus der Auftragsdatei soll die Bestellmenge aufaddiert werden für Artikel, die lt. Materialdatei ein bestimmtes Material beinhalten.

select sum(menge) into :rpgmenge from AUFTRAG
Where artikel in (select concat(Dessin, Farbe)
from Material
where MatNr = :rpgmatnr
group by Dessin, Farbe))

Im RPG rennt sich der Befehl tot ohne Fehlermeldung.
Im interaktiven SQL bringt er eine falche Summe!

Danke für eure Mühe!

Fuerchau
31-05-07, 10:32
select sum(menge) into :rpgmenge from AUFTRAG
Where artikel in (select concat(Dessin, Farbe)
from Material
where MatNr = :rpgmatnr
group by concat(Dessin, Farbe) ))

Der "Group by" muss die gleichen Felder enthalten, die auch in der Select-Klausel definiert sind.

Schneller geht das ganze, wenn du einen Index über "concat(Dessin, Farbe)" erstellst, ansonsten wird hier ein Tablescan durchgeführt.

Zusätzlich gibts doch sicherlich noch ein oder mehrere Mandentenfelder die sicherlich in der Where-Klausel aufgeführt sein sollten.

PS:
Besser wäre hier ein:

select sum(menge) into :rpgmenge from AUFTRAG
Where artikel in (select distinct concat(Dessin, Farbe)
from Material
where MatNr = :rpgmatnr )

Armin
31-05-07, 10:41
C/EXEC SQL
C+ select sum(BBEAB) into :Schussmeter from AUFGES_S5
C+ Where BARTN in (select concat(SGDESS, SGFB)
C+ from MASCHUS1
C+ where SGGARN = :GAGNR
C+ group by concat(SGDESS, SGFB))
C* and BDATU - int(BDATU / 100) * 100 = 6
C* and BARTN in ('5071760210', '5071770310')
C/END-EXEC

Was macht "DISTINCT"?
Hier der Originalbefehl. Interaktiv läuft er tadellos - hatte zuvor das Jahr nicht abgefragt. Das Jahr wird aus einem Datum im Format ""ttmmjj" herausgeschnitten.

Was ist der Unterschied zwischen interaktivem SQL und embedded SQL?

Fuerchau
31-05-07, 11:38
DISTINCT heißt nur eindeutige Zeilen.

Interaktives SQL optimiert für schnellere Anzeige der Daten. Beim Blättern wirds dann ggf. langsamer.

Embedded SQL optimiert eher für Wiederverwendbarkeit des Cursors.

Manchmal hilft ein "optimize for 1 record".

Wenn du das Programm ausführst, starte vorher mal STRDBG.
Im Joblog findest du dann diverse Meldungen, warum das so langsam ist.

Dass diese Form von SQL nicht gerade optimal ist, erklärt sich eigentlich von selbst.

"group by concat" führt häufig zu Tablescans, wenn nicht vorher eingeschränkt werden kann.
Prüfe, ob über SGGARN ein Index vorhanden ist, lege ihn ggf. an.

Berechnungen in der Where-Klausel verhindern ebenso die Benutzung eines Index. Ggf. muss man ein Zusatzfeld integrieren, dass das Datum dann eben in JJJJMMTT speichert, so dass man mittels Index und "between" abfragen kann.

Es gibt sicherlich noch mehr Optimierungen.