Problem mit Join von internen & DB-Tabellen

Getting started ... Alles für einen gelungenen Start.
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

Problem mit Join von internen & DB-Tabellen

Beitrag von debianfan (ForumUser / 84 / 64 / 0 ) »
Hallo,

ich habe 2 Selects:


SELECT * FROM DBTAB1 INTO TABLE @DATA(lt_itab1)
FOR ALL ENTRIES IN @it_input
WHERE beginndatum = @it_input-begdatum



SELECT * FROM DBTAB2 INTO TABLE @DATA(lt_itab2)
FOR ALL ENTRIES IN @it_input
WHERE datum = @it_input-datum

Ich brauche aus der zweiten Tabelle lt_itab2 nur die Datensätze, welche die gleiche Vertragsnummer haben wie in lt_itab1.

Lässt sich das mit einem Join erledigen ?
Oder gibts die Möglichkeit, den zweiten Select mit 2 mal for all entries @it_input-vertragsnummer und @lt_itab1-vertragsnummer anzugeben?

gruss & danke
Ich weiß viel - aber nicht alles - deswegen lerne ich gern dazu & bin für Hinweise von erfahrenen ITlern immer dankbar.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Problem mit Join von internen & DB-Tabellen

Beitrag von moo_jo (ForumUser / 36 / 10 / 7 ) »
Probiere das Mal. Ich glaube, damit könntest du es lösen

SELECT *
FROM DBTAB1
RIGHT JOIN DBTAB2 ON DBTAB2~VERTRAGSNUMMER EQ DBTAB1~VERTRAGSNUMMER
WHERE "deine condition
INTO TABLE @data(lt_result).

Folgende Benutzer bedankten sich beim Autor moo_jo für den Beitrag:
debianfan


Re: Problem mit Join von internen & DB-Tabellen

Beitrag von debianfan (ForumUser / 84 / 64 / 0 ) »
Ich habe 2 interne Tabellen und eine DBTAB
Ich weiß viel - aber nicht alles - deswegen lerne ich gern dazu & bin für Hinweise von erfahrenen ITlern immer dankbar.

Re: Problem mit Join von internen & DB-Tabellen

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
debianfan hat geschrieben: Oder gibts die Möglichkeit, den zweiten Select mit 2 mal for all entries @it_input-vertragsnummer und @lt_itab1-vertragsnummer anzugeben?
Nein. Aber es reicht ja:

Code: Alles auswählen.

for all entries in @lt_itab1-vertragsnummer where dbtab2~vertragsnummer = lt_itab1~vertragsnummer.
Die Lösung von moo_jo müsste aber auch gehen und du hast nur einen Join anstelle von zwei Selects.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
debianfan


Re: Problem mit Join von internen & DB-Tabellen

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Die Lösung von moo_jo müsste aber auch gehen und du hast nur einen Join anstelle von zwei Selects.
Die Lösung von moo_jo berücksichtigt aber die interne Tabelle nicht.

Generell finde ich die Frage von debianfan aber auch schlecht gestellt, denn er fragt, wie er die Werte mit derselben Vertragsnummer finden soll und gibt nicht an, wie die Vertragsnummernspalte heißt. Außerdem gibt er in seinen Beispiel-SELECTs noch weitere Bedingungen an, die er in seinem Fragetext komplett unerwähnt lässt. Für mich ist damit insgesamt nicht klar, welche Werte er überhaupt sucht.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
debianfan


Re: Problem mit Join von internen & DB-Tabellen

Beitrag von moo_jo (ForumUser / 36 / 10 / 7 ) »
ewx hat geschrieben:
debianfan hat geschrieben: Oder gibts die Möglichkeit, den zweiten Select mit 2 mal for all entries @it_input-vertragsnummer und @lt_itab1-vertragsnummer anzugeben?
Nein. Aber es reicht ja:

Code: Alles auswählen.

for all entries in @lt_itab1-vertragsnummer where dbtab2~vertragsnummer = lt_itab1~vertragsnummer.
Die Lösung von moo_jo müsste aber auch gehen und du hast nur einen Join anstelle von zwei Selects.

Den Befehl FOR ALL ENTRIES habe ich noch nicht verwendet.
Ansonsten: Viele Weg führen nach Rom oder? :)

Folgende Benutzer bedankten sich beim Autor moo_jo für den Beitrag:
debianfan


Re: Problem mit Join von internen & DB-Tabellen

Beitrag von debianfan (ForumUser / 84 / 64 / 0 ) »
Die Auflösung:

SELECT *
FROM DBTAB1
RIGHT JOIN DBTAB2 ON DBTAB1~nummer EQ DBTAB2~nummer
INTO CORRESPONDING FIELDS OF TABLE @lt_result
FOR ALL ENTRIES IN @ITAB1
WHERE DBTAB1~kennzeichen <> 'X'
AND DBTAB1~vertragsnummer = @ITAB1-vertragsnummer
AND DBTAB1~datum = @ITAB1-datum
AND DBTAB2~kennzeichen EQ '002'
AND DBTAB2~companycode BETWEEN '1000' AND '1500'


DANKE AN ALLE :up: :up: :up: :up: :up:
Ich weiß viel - aber nicht alles - deswegen lerne ich gern dazu & bin für Hinweise von erfahrenen ITlern immer dankbar.

Re: Problem mit Join von internen & DB-Tabellen

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
moo_jo hat geschrieben:Den Befehl FOR ALL ENTRIES habe ich noch nicht verwendet.
Ich habe auch lange Zeit keine rechte Verwendung dafür gesehen. Aber für Performancebeschleunigung über Puffertabellen eignet er sich hervorragend, denn er setzt die Zeilen der internen Tabelle SQL-seitig in den IN-Operator um und kommt in Richtung Datenbank auf diese Weise mit nur einem SELECT aus.

Nimm z.B. an, dass Du in der internen Tabelle M einen Haufen Materialnummern hast und die Materialtexte dazulesen möchtest.

Code: Alles auswählen.

REPORT ZTEST4.

TYPES: BEGIN OF TYPE_M,
         MATNR LIKE MARA-MATNR,
         MAKTX LIKE MAKT-MAKTX,
         BRGEW LIKE MARA-BRGEW,
         NTGEW LIKE MARA-NTGEW,
       END OF TYPE_M,

       BEGIN OF TYPE_PUFFERTABELLE,
         MATNR LIKE MARA-MATNR,
         MAKTX LIKE MAKT-MAKTX,
       END OF TYPE_PUFFERTABELLE.

DATA: M TYPE STANDARD TABLE OF TYPE_M WITH EMPTY KEY,
      BUFFER_TXT TYPE SORTED TABLE OF TYPE_PUFFERTABELLE WITH UNIQUE KEY MATNR.

FIELD-SYMBOLS <M> TYPE TYPE_M.

*** START-OF-SELECTION ***
START-OF-SELECTION.

** M sei mit Materialnummern und deren Gewichten gefüllt. Jetzt sollen die Texte dazugelesen werden. **

* Weg ohne Puffertabelle
LOOP AT M ASSIGNING <M>.
  SELECT SINGLE MAKTX INTO <M>-MAKTX FROM MAKT
   WHERE MATNR = <M>-MATNR
     AND SPRAS = SY-LANGU.
ENDLOOP.

* Weg mit Puffertabelle
SELECT MATNR MAKTX INTO TABLE BUFFER_TXT FROM MAKT
  FOR ALL ENTRIES IN M WHERE MATNR = M-MATNR
                         AND SPRAS = SY-LANGU.

LOOP AT M ASSIGNING <M>.
  <M>-MAKTX = BUFFER_TXT{ MATNR = <M>-MATNR }-MAKTX. " eckige statt der geschweiften Klammern verwenden, aber die kann das Forum nicht richtig darstellen
ENDLOOP.
Beide in obigem Beispielcode dargestellten Wege funktionieren. Wenn wir aber annehmen, dass M 5000 Materialien enthält, dann führt der erste Weg 5000 SELECTS auf die Datenbank durch, der zweite nur genau einen!

Früher hätte ich mir Gedanken gemacht, wie es denn mit der Hauptspeicherbelastung aussieht, wenn man so viele Datenbankdaten zusätzlich in eine Puffertabelle einliest. Aber wenn man drüber nachdenkt, dann ist das ein Lacher, denn die Hauptspeichermengen sind heute andere als früher. Ein Materialtext hat 40 Zeichen, die Materialnummer 18 Zeichen. Theoretisch braucht man also 58 Bytes pro Material (plus Index). Selbst wenn wir davon ausgehen, dass wegen Unicode und warum auch immer die Zeichen sehr ineffizient gespeichert werden und wir vier Bytes pro Zeichen brauchen, dann sind das bei 5000 Materialien 5000 x 58 x 4 = 1.160.000 Bytes, also gerade mal ein Megabyte. Bei den Hauptspeichermengen heutiger Server, die im Bereich von Hunderten von Gigabytes, teilweise sogar im Terabytebereich liegen, ist das gar nix! Selbst wenn man faul ist, sich die Definiton des Typs TYPE_PUFFERTABELLE spart und stattdessen BUFFER_TXT einfach als TYPE SORTED TABLE OF MAKTX WITH UNIQUE KEY MATNR definiert, ist die Arbeitsspeicherbelastung immer noch lächerlich. Wenn man die Puffertabelle im weiteren Programmverlauf nicht mehr braucht und ein reines Gewissen haben möchte, kann man ja direkt nach dem Übertragen in M ein FREE BUFFER_TXT hinterherschieben.

Aber ein SELECT statt 5000, das ist schon was, denn die Programmlaufzeit besteht bei üblichen Programmen fast nur aus der Dauer der Datenbankzugriffe.

Re: Problem mit Join von internen & DB-Tabellen

Beitrag von edwin (Specialist / 300 / 9 / 68 ) »
Hallo DeathAndPain,
ich muss Dich etwas korrigieren,bei FOR ALL ENTRIES wird die Selektion in mehreren Blöcken durchgeführt, die Systemeinstellungen dazu sind :

Code: Alles auswählen.

rsdb/max_blocking_factor 
rsdb/min_blocking_factor
rsdb/max_in_blocking_factor
rsdb/min_in_blocking_factor
bei uns ist die Blockung 100, so daß bei 5000 Matnr 50 Selects abgesetzt werden. Ist die Where Bedingugn sehr groß, kann es zu einem Dump mit "DBSQL_STMNT_TOO_LARGE " kommen.
Grüße Edwin

Folgende Benutzer bedankten sich beim Autor edwin für den Beitrag:
DeathAndPain


Re: Problem mit Join von internen & DB-Tabellen

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Vielen Dank, das war ein interessanter Hinweis.

Da muss man ja echt überlegen, ob es im Einzelfall nicht sogar performanter ist, den SELECT ohne Where zu machen und die überschüssigen Zeilen hinterher mit einem LOOP oder per DELETE itab WHERE rauszuschmeißen.

Seite 1 von 1

Vergleichbare Themen

4
Antw.
1593
Views
problem beim join über 2 Tabellen
von liberado » 14.05.2008 10:24 • Verfasst in ABAP® Core
2
Antw.
1909
Views
Problem, mit Wertübergabe bei zwei internen Tabellen
von scott111 » 06.04.2006 21:44 • Verfasst in Dialogprogrammierung
7
Antw.
8243
Views
Felder einer internen Tabelle hinzufügen + Join
von LukasHD » 05.02.2013 10:34 • Verfasst in ABAP® für Anfänger
12
Antw.
6101
Views
3 Tabellen-Join
von kaufikauf » 12.08.2014 08:00 • Verfasst in ABAP® für Anfänger
4
Antw.
2630
Views
Tabellen Join
von commolus » 08.06.2012 10:54 • Verfasst in ABAP Objects®

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141