was Du suchst, nennt sich Subquery.Bitfummler hat geschrieben:Hallo,
ich suche eine unkomplizierte Lösung für folgende Aufgabe (dieses Beispiel ist nur vereinfacht dargestellt):
Ich möchte mit einem Select-Join die mara und die marc in eine interne Tabelle lesen. Sogesehen erstmal easy! Ich will jedoch nur mara-marc-saetze, bei denen zur materialnummer die werke 1 + 2 existieren. existiert nur das werk 1 oder nur das werk 2, so moechte ich diese saetze nicht in der tabelle haben.
ich will einen loop ueber die interne tabelle mit entsprechenden gruppenwechsel und delete vermeiden.
haette da jemand eine idee? :idea:
bitfummler
Code: Alles auswählen.
SELECT >Feldliste<
FROM MARA
INNER JOIN MARC
ON marc~matnr EQ mara~matnr
WHERE
EXISTS
( SELECT FROM marc
WHERE matnr EQ mara~matnr
AND werks EQ >werk1< )
AND
EXISTS
( SELECT FROM marc
WHERE matnr EQ mara~matnr
AND werks EQ >werk2< ).
Bitfummler hat geschrieben:Hallo ereglam,
vielen dank fuer die promte antwort. stimmt: die subquery gibt's ja auch noch.
Ich bekomme jedoch die Fehlermeldung "FROM" konnte nicht interpretiert werden. Mögliche Fehlerursache: Falsche Schreibweise oder Kommafehlr.
was habe ich falsch gemacht?
DATA: gt_marc TYPE TABLE OF marc,
gs_marc LIKE LINE OF gt_marc.
SELECT mara~matnr mara~ernam mara~aenam
INTO (mara-matnr, mara-ernam, mara-aenam)
FROM mara
INNER JOIN marc
ON marc~matnr = mara~matnr
WHERE
EXISTS
( SELECT FROM marc
WHERE matnr = mara~matnr
AND werks = '0101' )
AND
EXISTS
( SELECT FROM marc
WHERE matnr = mara~matnr
AND werks = '0105' ).
und noch eine frage hierzu: was sagt die performance zu diesem select? gerade mit derartig grossen tabellen..
gruss
bitfummler
Himmel JA!! wie blöd von mir... ich habe als das select der mara im auge gehabt und deswegen bin ich auch mit der hilfe nicht weiter gekommen..ereglam hat geschrieben:nun, mir ist wohl beim Aufschreiben des Grundgerüsts (aus dem Kopf) ein Fehler unterlaufen: in den Subqueries muss zwischen dem SELECT und FORM ein '*' oder ein einzelnes Feld eingefügt werden.
Andererseits hätte ein Blick in die Hilfe helfen können, da ich nur ein Grundgerüst und nicht die vollständige Lösung liefern wollte...
ging mir zu Anfang auch so. Habe dann aber durch Herausnahme von Teilen schnell gemerkt, welcher Teil denn den Fehler produzierte...Bitfummler hat geschrieben:...
Himmel JA!! wie blöd von mir... ich habe als das select der mara im auge gehabt und deswegen bin ich auch mit der hilfe nicht weiter gekommen..
...
Ist so nicht richtig. Das SELECT/ENDSELECT-Konstrukt bewirkt genau wie ein INTO TABLE einen blockweisen Datentransport, beide Varianten sind also gleich schnell.SELECT-ENDSELECT-Schleifen solltest Du Dir garnicht erst angewöhnen. Benutze 'INTO CORRESPONDING FIELDS OF >int. tabelle<' mit anschließendem LOOP
naja, so ganz am anfang bin ich nicht mehr.. derartige selects verwende ich eh seltenstens.ereglam hat geschrieben:ging mir zu Anfang auch so. Habe dann aber durch Herausnahme von Teilen schnell gemerkt, welcher Teil denn den Fehler produzierte...Bitfummler hat geschrieben:...
Himmel JA!! wie blöd von mir... ich habe als das select der mara im auge gehabt und deswegen bin ich auch mit der hilfe nicht weiter gekommen..
...
PS:
SELECT-ENDSELECT-Schleifen solltest Du Dir garnicht erst angewöhnen. Benutze 'INTO CORRESPONDING FIELDS OF >int. tabelle<' mit anschließendem LOOP...
hallo haubi,Haubi hat geschrieben:@Bitfummler: die Performance sollte immer noch gut sein, da die Subqueries auf den Primärschlüssel der MARC gehen. Intern wird das in einen INNER JOIN umgewandelt AFAIK.
@ereglam:Ist so nicht richtig. Das SELECT/ENDSELECT-Konstrukt bewirkt genau wie ein INTO TABLE einen blockweisen Datentransport, beide Varianten sind also gleich schnell.SELECT-ENDSELECT-Schleifen solltest Du Dir garnicht erst angewöhnen. Benutze 'INTO CORRESPONDING FIELDS OF >int. tabelle<' mit anschließendem LOOP
Netto verlierst Du also sogar Performance, wenn Du die Daten nur holst und einmalig in einem LOOP verarbeitest.
Benötigst Du die Daten allerdings später noch einmal gewinnt wieder die "INTO TABLE/LOOP"-Variante.
Gruss,
Haubi
damit war gemeint:Bitfummler hat geschrieben:ereglam hat geschrieben:...ging mir zu Anfang auch so. ...
die MARA im Produktivsystem würde ich auch eher selten komplett in eine interne Tabelle laden wollen. Für so etwas gibt es ja dann noch die OPEN CURSOR... FETCH mit blockweisem Bearbeiten der Ergebnismenge...Haubi hat geschrieben:Da gilt wieder genau das, was immer gilt, wenn es um Performance geht: It depends...
...oder den SELECT...PACKAGE-SIZE.ereglam hat geschrieben:die MARA im Produktivsystem würde ich auch eher selten komplett in eine interne Tabelle laden wollen. Für so etwas gibt es ja dann noch die OPEN CURSOR... FETCH mit blockweisem Bearbeiten der Ergebnismenge...Haubi hat geschrieben:Da gilt wieder genau das, was immer gilt, wenn es um Performance geht: It depends...
Wenn es nur darum geht, eine Tabelle auszulesen und die ausgelesenen Sätze zu verarbeiten (z.B. klassische Listverarbeitung) ist der SELECT...ENDSELECT überlegen.Außerdem kann mir keiner erzählen, dass ein LOOP langsamer sei als ein SELECT. Lediglich unter der Berücksichtigung der Ladezeit der Tabelle dürften kurze Tabellen insgesamt langsamer sein.
Code: Alles auswählen.
select >felder<
into corresponding fields of table t_matnr
from mara join marc as m1 on m1~matnr = mara~matnr
join marc as m2 on m2~matnr = mara~matnr
where m1~werks = >werk1<
and m2~werks = >werk2<.