INNER JOIN

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

INNER JOIN

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »

Code: Alles auswählen.

TYPES: BEGIN OF ty_test,
         matnr TYPE marc-matnr,
         werks TYPE marc-werks,
         ekgrp TYPE marc-ekgrp,
         matkl TYPE mara-matkl,
         mtart TYPE mara-mtart,
         meins TYPE mara-meins,
         maktx TYPE makt-maktx,
         lbkum TYPE mbew-lbkum,
         berid TYPE mdlg-berid,
         dtnum TYPE mdkp-dtnum,
       END OF ty_test.

DATA: ls_outtab TYPE ty_outtab,
      lt_outtab TYPE TABLE OF ty_outtab,
      ls_marc   TYPE marc,
      lt_marc   TYPE TABLE OF marc,
      ls_test   TYPE ty_test,
      lt_test   TYPE TABLE OF ty_test,
      ls_mdlg   TYPE mdlg,
      lt_mdlg   TYPE TABLE OF mdlg.

*At Selection-screen
SELECTION-SCREEN BEGIN OF BLOCK start WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS: so_matnr FOR ls_marc-matnr DEFAULT '30660'.
  SELECT-OPTIONS: so_werks FOR ls_marc-werks DEFAULT '2200'.
  SELECT-OPTIONS: so_berid FOR ls_mdlg-berid DEFAULT '2200'.
SELECTION-SCREEN END OF BLOCK start.

SELECT a~matnr,
  a~werks,
  a~ekgrp,
  b~matkl,
  b~mtart,
  b~meins,
  c~maktx,
  d~lbkum,
  e~berid,
  f~dtnum
FROM marc AS a
INNER JOIN mara AS b
ON a~matnr = b~matnr
INNER JOIN makt AS c
ON a~matnr = c~matnr
INNER JOIN mbew AS d
ON a~matnr = d~matnr
AND a~werks = d~bwkey
INNER JOIN mdlg AS e
ON a~werks = e~werks
INNER JOIN mdkp AS f
ON a~werks = f~plwrk
AND a~matnr = f~matnr
WHERE a~matnr IN @so_matnr
  AND a~werks IN @so_werks
  AND e~berid IN @so_berid
INTO TABLE @lt_test.

DELETE ADJACENT DUPLICATES FROM lt_test.

cl_demo_output=>display( lt_test ).

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


Re: INNER JOIN

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Hallo Zusammen,
ich habe mir einen JOIN erstellt. Leider bekomme ich einen riesen Haufen an Datensätzen wenn ich in SELECT OPTIONS zwei Werte eintrage. Kann mir jemand helfen?
Vielen Dank. :)

Re: INNER JOIN

Beitrag von jocoder (Specialist / 343 / 3 / 102 ) »
Ein paar Verbesserungsvorschläge:

1. Die Tabelle MBEW kann unterschiedliche Bewertungsarten für ein Material besitzen (bsp. Material ist chargenbewertet)
Im JOIN erfolgt keine Eingrenzung nach Bewertungsart.

2. Der Bewertungskreis muss nicht dem Werk entsprechen. In der Tabelle T001W befindet sich die Zuordnung Werk zu Bewertungskreis.

3. Wenn ein Material Kurztexte in mehreren Sprachen besitzt, kommt es mehrfach. Ein Einschränkung nach Sprache wurde sicherlich Sinn ergeben.

4. JOINs sollten nach Möglichkeit nicht mehr als 5 Tabellen enthalten, sonst kann es zu Laufzeitfehlern kommen. Diese Grenze ist nicht in Stein gemeißelt, bei kleinen Customizing-Tabellen kann man auch höher gehen, bei großen Tabellen ist dies nicht zu empfehlen.
Also am besten die JOINs splitten:

Code: Alles auswählen.

SELECT a~matnr,
  a~werks,
  a~ekgrp,
  b~matkl,
  b~mtart,
  b~meins,
  d~lbkum,
  e~berid,
  f~dtnum
FROM marc AS a
INNER JOIN mara AS b
ON a~matnr = b~matnr
INNER JOIN t001w AS c
ON a~werks = c~werks
INNER JOIN mbew AS d
ON a~matnr = d~matnr
AND c~bwkey = d~bwkey
INNER JOIN mdlg AS e
ON a~werks = e~werks
INNER JOIN mdkp AS f
ON a~werks = f~plwrk
AND a~matnr = f~matnr
WHERE a~matnr IN @so_matnr
  AND a~werks IN @so_werks
  AND e~berid IN @so_berid
  AND d~bwtar = @space
INTO TABLE @lt_test.
IF sy-subrc <> 0.
  RETURN.
ENDIF.

SELECT matnr, maktx FROM makt
  FOR ALL ENTRIES IN @lt_test
  WHERE matnr = @lt_test-matnr AND spras = @sy-langu
  INTO TABLE @DATA(material_texts).
LOOP AT lt_test ASSIGNING FIELD-SYMBOL(<material_entity>).
  READ TABLE material_texts REFERENCE INTO DATA(material_text)
    WITH KEY matnr = <material_entity>-matnr.
  IF sy-subrc = 0.
    <material_entity>-maktx = material_text->*-maktx.
  ENDIF.
ENDLOOP.
5. Im Screenshoot sieht es danach aus, als ob die Tabelle MDLG mehrere Lagerorte pro Dispobereich und Werk hat. D.h. für jeden Lagerort wiederholt sich die Ausgabe. Eventuell macht eine Eingrenzung nach Lagerort Sinn oder im JOIN kann die Tabelle MDLG durch MDLW getauscht werden, wenn es nur darum geht, die Dispobereiche des Werkes anzuzeigen.
Zuletzt geändert von jocoder am 16.02.2022 12:05, insgesamt 1-mal geändert.

Re: INNER JOIN

Beitrag von qyurryus (Specialist / 112 / 86 / 45 ) »
jocoder hat geschrieben:
16.02.2022 11:52
4. JOINs sollten nach Möglichkeit nicht mehr als 5 Tabellen enthalten, sonst kann es zu Laufzeitfehlern kommen. Diese Grenze ist nicht in Stein gemeißelt, bei kleinen Customizing-Tabellen kann man auch höher gehen, bei großen Tabellen ist dies nicht zu empfehlen.
Hast du eine Quelle hierfür? Ich benutze öfters Joins mit mehr als 5 Tabellen und hatte noch nie Probleme. Und performance-technisch läuft das auch immer recht flott (sofern die Join-Bedingungen sauber und möglichst eindeutig sind, natürlich) - auch wenn laut SAP Hilfe bei Joins der Buffer umgangen wird.

Re: INNER JOIN

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
jocoder hat geschrieben:
16.02.2022 11:52
5. Im Screenshoot sieht es danach aus, als ob die Tabelle MDLG mehrere Lagerorte pro Dispobereich und Werk hat. D.h. für jeden Lagerort wiederholt sich die Ausgabe. Eventuell macht eine Eingrenzung nach Lagerort Sinn oder im JOIN kann die Tabelle MDLG durch MDLW getauscht werden, wenn es nur darum geht, die Dispobereiche des Werkes anzuzeigen.
Vielen Dank für die Antwort. Diesbezüglich müsste aber doch wenn ich nur einen Wert in meiner SELECT OPTIONS eintrage, auch die gleiche Ausgabe haben oder wieso ist im ersten Screenshot nur eine Zeile?

Re: INNER JOIN

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
jocoder hat geschrieben:
16.02.2022 11:52
Ein paar Verbesserungsvorschläge:

1. Die Tabelle MBEW kann unterschiedliche Bewertungsarten für ein Material besitzen (bsp. Material ist chargenbewertet)
Im JOIN erfolgt keine Eingrenzung nach Bewertungsart.
Aus der MBEW beziehe ich nur den Gesamten bewerteten Bestand. Dieser bezieht sich nur auf das Werk. Daher kann ich ihn für jede Materialnummer bestimmen.

Re: INNER JOIN

Beitrag von jocoder (Specialist / 343 / 3 / 102 ) »
@qyurryus
Die 5 Tabellen sind eine rein empirische Grenze. Die Probleme, die bei noch größeren JOINS auftreten, sind Ressourcenprobleme, die nur sporadisch auftreten und sehr mit der Datenbankkonfiguration und der aktuellen Auslastung zusammenhängen. Bei Oracle-Datenbanken wird zur Ausführung des JOINs, Blöcke im Tablespace PSAPTEMP allokiert. Je mehr Tabellen und größer diese desto mehr Blöcke. Wenn dieser Tablespace nicht auf Autoextend eingestellt kann er überlaufen und der die Ausführung des SQL-Statements dumpt. Da man nicht vorsehen kann, ob immer genügend Platz im Tablespace vorhanden sind, begrenzt man die JOIN-Größe. Die Zahl 5 hat mir ein Basisbetreuer gesagt, bei anderer Systemkonfiguration kann man oder wenn die JOINs nur bei schwacher Auslastung ausgeführt werden, auch auf 6 oder 7 hochgehen. Dieses Problem ist zuletzt bei uns 2016 aufgetreten, seitdem habe ich mich immer an die Grenze gehalten und deswegen ist auch kein SQL-Statement mehr gedumpt.
Zuletzt geändert von jocoder am 16.02.2022 13:03, insgesamt 1-mal geändert.

Folgende Benutzer bedankten sich beim Autor jocoder für den Beitrag:
qyurryus


Re: INNER JOIN

Beitrag von jocoder (Specialist / 343 / 3 / 102 ) »
Vielen Dank für die Antwort. Diesbezüglich müsste aber doch wenn ich nur einen Wert in meiner SELECT OPTIONS eintrage, auch die gleiche Ausgabe haben oder wieso ist im ersten Screenshot nur eine Zeile?
Ohne das DELETE ADJACENT DUPLICATES-Statement schon. Mit diesem Statement werden alle mehrfach und nacheinander vorkommenten Zeilen gelöscht. Im ersten Screensheet kommen die mehrfachen Zeilen nicht nacheinander vor, daher auch die mehrfache Ausgabe.
Wenn das DELETE ADJACENT DUPLICATES-Statement auskommentiert wird, welche Ausgabe erhalten wir dann bei Eingabe von nur einer Materialnummer?

Seite 1 von 1

Vergleichbare Themen

1
Antw.
1244
Views
Join mit Left Outer Join
von Rude1986 » 17.01.2021 19:53 • Verfasst in ABAP® für Anfänger
3
Antw.
3373
Views
Was ist ein Join?
von Schmarsi » 28.09.2010 11:37 • Verfasst in ABAP® für Anfänger
17
Antw.
7359
Views
JOIN
von robin1at » 22.02.2006 17:28 • Verfasst in ABAP® für Anfänger
3
Antw.
3085
Views
inner join
von dawns » 14.05.2007 15:49 • Verfasst in ABAP® für Anfänger
1
Antw.
1478
Views
inner join
von dimes » 20.01.2006 07:57 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Nach MESSAGE TYPE E Felder entsperren
vor einer Stunde von a-dead-trousers gelöst 6 / 6010
ABAP - Mail so10 Text
vor 2 Stunden von retsch 6 / 113
selection-screen comment mit icon
vor 11 Stunden von DeathAndPain 9 / 1159

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.

Aktuelle Forenbeiträge

Nach MESSAGE TYPE E Felder entsperren
vor einer Stunde von a-dead-trousers gelöst 6 / 6010
ABAP - Mail so10 Text
vor 2 Stunden von retsch 6 / 113
selection-screen comment mit icon
vor 11 Stunden von DeathAndPain 9 / 1159

Unbeantwortete Forenbeiträge

SD_PRINT_TERMS_OF_PAYMENT
vor 5 Tagen von Manfred K. 1 / 930
BUSOBJEKT zu CMIS PHIO ermitteln
vor 3 Wochen von snooga87 1 / 2735