bestimmte Einträge aus Tabellen-Join

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

bestimmte Einträge aus Tabellen-Join

Beitrag von Patrick1982 (ForumUser / 33 / 4 / 0 ) »
Moin,

ich hab folgende Problemstellung:
Zwei DB-Tabellen:

Tabelle A
Feld KEY
Feld DOCNR
...

Tabelle B
Feld KEY
Feld DOCNR
Feld DATE
...

Das Feld DOCNR ist in Tabelle A nicht immer gefüllt. Falls es aber gefüllt ist, möchte ich zusätzlich den Datensatz aus Tabelle B lesen. Dazu baue ich folgenden Join:

Code: Alles auswählen.

SELECT * FROM tabelle_a AS a
  LEFT OUTER JOIN tabelle_b AS b
    ON a~docnr = b~docnr
  INTO TABLE @DATA(lt_itab).
Damit erhalte ich alle Einträge aus A und falls vorhanden auch die Daten aus B.
Soweit so gut. Nun aber das Problem: In Tabelle B kann es zu dieser DOCNR mehrere Einträge geben, in denen verschiedene Werte in DATE stehen. Wenn das der Fall ist, dann wirft er mir derzeit mehrere Zeilen aus. Ich möchte dann aber nur den Eintrag aus B sehen, der den größten Wert in DATE hat.

Bekomme ich das schon irgendwie in den Select eingebaut?
Oder bleibt keine Wahl als hinterher die itab zu sortieren und die Mehrfacheinträge wieder zu löschen?

Da es sich hier um sehr große Ergebnismengen handelt, sollte die Lösung so performant wie möglich sein.

Hat jemand einen Tipp?
Dankeschön :-)

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


Re: bestimmte Einträge aus Tabellen-Join

Beitrag von a-dead-trousers (Top Expert / 4394 / 223 / 1182 ) »

Code: Alles auswählen.

SELECT A~KEY, B~KEY, A~DOCNR, MAX( B~DATE )  
  FROM tabelle_a AS a
  LEFT OUTER JOIN tabelle_b AS b
    ON a~docnr EQ b~docnr
  INTO TABLE @DATA(lt_itab)
  GROUP BY A~KEY, B~KEY, A~DOCNR.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
rob_abc

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: bestimmte Einträge aus Tabellen-Join

Beitrag von black_adept (Top Expert / 4080 / 125 / 934 ) »
Falls das Datum eindeutig ist, kannst du auch mit SUBSELECT arbeiten um das Gruppieren zu vermeiden.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: bestimmte Einträge aus Tabellen-Join

Beitrag von rob_abc (Specialist / 103 / 24 / 44 ) »
Wenn Performance wichtig ist, würde ich mit GROUP in der Situation nicht arbeiten. Da ist ein Join mit anschliessenden DELETE schneller. Bei mir braucht GROUP fast doppelt so lang.

Code: Alles auswählen.

REPORT.
CLASS lcl_report DEFINITION.

  PUBLIC SECTION.
    CLASS-METHODS main.
  PRIVATE SECTION.
    CLASS-METHODS select_with_delete.
    CLASS-METHODS select_with_group.

ENDCLASS.

CLASS lcl_report IMPLEMENTATION.

  METHOD main.
    select_with_delete( ).
    select_with_group( ).
  ENDMETHOD.


  METHOD select_with_delete.
    SELECT t1~pgmid, t1~object, t2~obj_name FROM tadir AS t1
      LEFT OUTER JOIN tadir AS t2 ON t1~obj_name = t2~obj_name
      WHERE t1~obj_name LIKE 'A%'
      ORDER BY  t1~pgmid, t1~object, t2~obj_name
      INTO TABLE @DATA(t3)
      BYPASSING BUFFER.
    "cl_demo_output=>write( lines( t3 ) ).
    DELETE ADJACENT DUPLICATES FROM t3 COMPARING pgmid object obj_name.
    "cl_demo_output=>write( lines( t3 ) ).
  ENDMETHOD.


  METHOD select_with_group.
    SELECT t1~pgmid, t1~object, t2~obj_name FROM tadir AS t1
      LEFT OUTER JOIN tadir AS t2 ON t1~obj_name = t2~obj_name
      WHERE t1~obj_name LIKE 'A%'
      GROUP BY t1~pgmid, t1~object, t2~obj_name
      INTO TABLE @DATA(t3).
    "cl_demo_output=>write( lines( t3 ) ).
  ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.
  lcl_report=>main( ).
  cl_demo_output=>display( ).

Folgende Benutzer bedankten sich beim Autor rob_abc für den Beitrag:
a-dead-trousers


Re: bestimmte Einträge aus Tabellen-Join

Beitrag von ewx (Top Expert / 4842 / 310 / 638 ) »
Wie Stefan geschrieben hat: du kannst es mit einem subquery lösen:

Code: Alles auswählen.

WHERE date = ( SELECT max(date) FROM ... ).

Re: bestimmte Einträge aus Tabellen-Join

Beitrag von DeathAndPain (Top Expert / 1932 / 252 / 410 ) »
Ohne es ausprobiert zu haben, fällt es mir schwer mir vorzustellen, dass der Subquery-Ansatz eine zu den Alternativen konkurrenzfähige Performance aufweisen soll...

Re: bestimmte Einträge aus Tabellen-Join

Beitrag von black_adept (Top Expert / 4080 / 125 / 934 ) »
Subquery ist schneller als die meisten glauben.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Seite 1 von 1

Vergleichbare Themen

18
Antw.
9088
Views
Join nur für bestimmte Tabelleneinträge Beispiel MARA/MARC
von Bitfummler » 28.02.2005 14:09 • Verfasst in ABAP® Core
4
Antw.
2168
Views
Bestimmte Spalten zweier Tabellen abgleichen
von kaufikauf » 15.08.2014 08:55 • Verfasst in ABAP® für Anfänger
1
Antw.
2510
Views
2 interne Tabellen vergleichen, Einträge löschen
von supermario73 » 07.02.2007 10:46 • Verfasst in ABAP® Core
12
Antw.
6896
Views
3 Tabellen-Join
von kaufikauf » 12.08.2014 08:00 • Verfasst in ABAP® für Anfänger
4
Antw.
3034
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.