Problem mit Join von internen & DB-Tabellen


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

Problem mit Join von internen & DB-Tabellen

Beitragvon debianfan » 10.11.2017, 09:10

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.
debianfan
ForumUser
 
Beiträge: 25
Registriert: 25.04.2017, 12:42
Dank erhalten: 0 mal
Ich bin: Student/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Problem mit Join von internen & DB-Tabellen

Beitragvon moo_jo » 10.11.2017, 10:02

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).

Für diese Nachricht hat moo_jo einen Dank bekommen :
debianfan
moo_jo
ForumUser
 
Beiträge: 7
Registriert: 13.10.2017, 08:34
Dank erhalten: 2 mal
Ich bin: Entwickler/in

Re: Problem mit Join von internen & DB-Tabellen

Beitragvon debianfan » 10.11.2017, 10:08

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.
debianfan
ForumUser
 
Beiträge: 25
Registriert: 25.04.2017, 12:42
Dank erhalten: 0 mal
Ich bin: Student/in

Re: Problem mit Join von internen & DB-Tabellen

Beitragvon ewx » 10.11.2017, 11:07

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.

Für diese Nachricht hat ewx einen Dank bekommen :
debianfan
ewx
Top Expert
 
Beiträge: 3415
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 207 mal

Re: Problem mit Join von internen & DB-Tabellen

Beitragvon DeathAndPain » 10.11.2017, 13:07

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.

Für diese Nachricht hat DeathAndPain einen Dank bekommen :
debianfan
DeathAndPain
Specialist
 
Beiträge: 266
Registriert: 05.05.2006, 10:14
Dank erhalten: 65 mal
Ich bin: Entwickler/in

Re: Problem mit Join von internen & DB-Tabellen

Beitragvon moo_jo » 10.11.2017, 13:32

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? :)

Für diese Nachricht hat moo_jo einen Dank bekommen :
debianfan
moo_jo
ForumUser
 
Beiträge: 7
Registriert: 13.10.2017, 08:34
Dank erhalten: 2 mal
Ich bin: Entwickler/in

Re: Problem mit Join von internen & DB-Tabellen

Beitragvon debianfan » 10.11.2017, 13:53

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.
debianfan
ForumUser
 
Beiträge: 25
Registriert: 25.04.2017, 12:42
Dank erhalten: 0 mal
Ich bin: Student/in

Re: Problem mit Join von internen & DB-Tabellen

Beitragvon DeathAndPain » 13.11.2017, 14:23

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.
DeathAndPain
Specialist
 
Beiträge: 266
Registriert: 05.05.2006, 10:14
Dank erhalten: 65 mal
Ich bin: Entwickler/in

Re: Problem mit Join von internen & DB-Tabellen

Beitragvon edwin » 13.11.2017, 16:26

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

Für diese Nachricht hat edwin einen Dank bekommen :
DeathAndPain
edwin
Specialist
 
Beiträge: 186
Registriert: 27.02.2007, 17:15
Wohnort: Ludwigsburg
Dank erhalten: 11 mal
Ich bin: Freiberufler/in

Re: Problem mit Join von internen & DB-Tabellen

Beitragvon DeathAndPain » 14.11.2017, 13:00

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.
DeathAndPain
Specialist
 
Beiträge: 266
Registriert: 05.05.2006, 10:14
Dank erhalten: 65 mal
Ich bin: Entwickler/in


Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
gelöst Protokoll vergangener RFC Aufrufe
vor 16 Stunden von Dele 3 Antw.
BREAK-POINT-IDs verwenden
vor 15 Stunden von ralf.wenzel 2 Antw.
MEREQ001 Zusatzfelder ausblenden
vor 3 Tagen von SAP4Echo 0 Antw.
gelöst Z Tabelle Key Feld ändern
vor 3 Tagen von DeathAndPain 3 Antw.
gelöst Funktionsbaustein EXIT_SAPLCORF_404 in Transaktion COR6N
vor 20 Stunden von SAP_ENTWICKLER 2 Antw.

  Ähnliche Beiträge beta
Felder einer internen Tabelle hinzufügen + Join
06.02.2013, 08:48 von JHM 7 Antw.
gelöst 3 Tabellen-Join
12.08.2014, 13:52 von kaufikauf 12 Antw.
Join-Problem
20.01.2005, 09:35 von Gast 3 Antw.
View 2 Tabellen mit left inner join ?
10.04.2008, 10:05 von Kleenmex 4 Antw.
Inhaltübergabe bei internen Tabellen
22.10.2007, 13:17 von AEONFLUX 3 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: Yahoo [Bot]

Feedback ...?

Was können wir verbessern? Hinterlasse deine Kontaktdaten, wenn du eine direkte Antwort möchtest.

... Absenden!