SELECT-Abfrage über mehrere Tabellen

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

SELECT-Abfrage über mehrere Tabellen

Beitrag von Krypt1k0n (ForumUser / 9 / 2 / 0 ) »
Hallo zusammen,

ich habe folgende 3 Tabellen:

Tabelle 1:
ID_1 Status
123 OK
456 N_OK

Tabelle 2:
ID_2 Status
789 XYZ
101112 ABC

Tabelle 3:
ID_1 ID_2
123 789
123 101112

Ich möchte nun eine SELECT-Abfrage erstellen, die mir alle Datensätze aus Tabelle 1 zurückgibt, welche über Tabelle 3 mit einem Datensatz aus Tabelle 2 verknüpft sind und den Status ABC haben. Besonderheit dabei ich möchte den Datensatz nur angezeigt bekommen, wenn ALLE Datensätze aus Tabelle 2 die mit dem Datensatz aus Tabelle 1 verknüpft sind den Status ABC haben.

Beispiel von oben: Hier würde ich keine Datensätze angezeigt bekommen, da Datensatz "123" mit einem Datensatz verknüpft ist, der den Status ABC hat (mit 101112) ABER auch mit einem Datensatz verknüpft ist der den Status XYZ hat (mit 789). Hätte wiederum Datensatz 789 den Status ABC will ich den Datensatz 123 angezeigt bekommen, weil er nur mit Datensätzen aus Tabelle 2 verknüpft ist, die den Status ABC haben.

Mein bisheriger Ansatz war folgender:
SELECT *
FROM tabelle1
JOIN tabelle3 ON tabelle1~id1 = tabelle3~id1
JOIN tabelle2 ON tabelle3~id2 = tabelle2~id2
INTO ...
WHERE tabelle2~status = 'ABC'.

Diese Anfrage bringt aber nicht das oben beschriebenes Ergebnis...

Schonmal vielen Dank für eure Hilfe :)

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


Re: SELECT-Abfrage über mehrere Tabellen

Beitrag von LeMinion (ForumUser / 20 / 1 / 6 ) »
Wie eigentlich bei so ziemlich jeder etwas komplexeren Aufgabenstellung, die mit SQL gelöst werden soll, kommt es darauf an, mit welchem Release man arbeitet.
Je nach Stand kann die Lösung sehr unterschiedlich ausfallen. Auf die Schnelle würde mir sowas einfallen:

Code: Alles auswählen.

" Erst mal ein bisschen Typisierung, damit klar ist, wie der folgende
" Select aufgebaut ist:
TYPES:
  BEGIN OF id_status,
    id     TYPE string,
    status TYPE string,
  END OF id_status,
  id_statuses TYPE SORTED TABLE OF id_status WITH UNIQUE KEY id,
  BEGIN OF relation,
    parent TYPE string,
    child  TYPE string,
  END OF relation,
  relations TYPE SORTED TABLE OF relation WITH UNIQUE KEY parent child.

" Dann noch ein bisschen Datensätze annehmen:
DATA(table1) = VALUE id_statuses(
  ( id = '123'  status = 'OK' )
  ( id = '456'  status = 'OK' )
).
DATA(table2) = VALUE id_statuses(
  ( id = '789'  status = 'XYZ' )
  ( id = '101112'  status = 'ABC' )
  ( id = '4711'  status = 'ABC' )
  ( id = '4712'  status = 'ABC' )
).
DATA(table3) = VALUE relations(
  ( parent = '123'  child = '789' )
  ( parent = '123'  child = '101112' )
  ( parent = '456'  child = '4711' )
  ( parent = '456'  child = '4712' )
).

" Dann der eigentliche Select, der natürlich nicht auf internen Tabellen
" laufen kann, daher andere Tabellennamen:
SELECT * FROM tabelle1
  WHERE id IN (
    SELECT 3~parent
      FROM tabelle3 AS 3
      INNER JOIN tabelle2 AS 2
      ON 2~id = 3~child
      GROUP BY 3~parent
      HAVING SUM( CASE WHEN 2~status = 'ABC' THEN 1 ELSE 0 END ) > 0
      AND SUM( CASE WHEN 2~status <> 'ABC' THEN 1 ELSE 0 END ) = 0
  )
  INTO TABLE @DATA(entries).

LOOP AT entries INTO DATA(entry).
  WRITE: / entry-id, entry-status.
ENDLOOP.
Das Ergebnis hiervon ist, das die ID 456 gefunden wird, aber die ID 123 nicht, weil für letztere eben nicht alle verknüpften Einträge aus Tabelle 2 den gewünschten Status haben. Aber das ist eben erst mit aktuelleren Releases möglich, fürchte ich. Probier doch mal aus und berichte dann hier, ob das für Dich paßt.

Re: SELECT-Abfrage über mehrere Tabellen

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Anstatt HAVING ginge wahrscheinlich auch ein SUBSELECT mit NOT EXSISTS:

Code: Alles auswählen.

SELECT * FROM tabelle1
  JOIN tabelle3 AS 3
      ON 1~ID = 3~parent
      JOIN tabelle2 AS 2
      ON 2~id = 3~child     
      WHERE NOT EXSISTS ( SELECT * FROM tabelle2 AS sub2
                                 WHERE sub2~id = 2~ID AND sub2~status <> 'ABC' )
  INTO TABLE @DATA(entries).
Gruß Hendrik

Re: SELECT-Abfrage über mehrere Tabellen

Beitrag von LeMinion (ForumUser / 20 / 1 / 6 ) »
JHM hat geschrieben:
21.10.2022 12:01
Anstatt HAVING ginge wahrscheinlich auch ein SUBSELECT mit NOT EXSISTS
Im Grund ja, aber wenn ich die Anfrage richtig verstanden habe, dann braucht es auch ein EXISTS, das gleichzeitig sicherstellt, daß nur Einträge aus tabelle1 gelesen werden, die auch mindestens einen Status in tabelle2 haben. Ein Feedback des OP wäre an dieser Stelle schön. 😉

Re: SELECT-Abfrage über mehrere Tabellen

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
LeMinion hat geschrieben:
22.10.2022 17:28

Im Grund ja, aber wenn ich die Anfrage richtig verstanden habe, dann braucht es auch ein EXISTS, das gleichzeitig sicherstellt, daß nur Einträge aus tabelle1 gelesen werden, die auch mindestens einen Status in tabelle2 haben.
Ok übersehen, aber das bedeutet ja "nur" zwei SubSelects oder evtl. geschachtelte SubSelects.
LeMinion hat geschrieben:
22.10.2022 17:28
Ein Feedback des OP wäre an dieser Stelle schön. 😉
Genau, ohne weiteren Input kann man schlecht helfen....
Gruß Hendrik

Seite 1 von 1

Vergleichbare Themen

2
Antw.
3899
Views
SELECT - Options & SELECT Abfrage
von Mavrix » 14.05.2007 08:41 • Verfasst in ABAP® für Anfänger
2
Antw.
1823
Views
select abfrage
von anki_86 » 13.06.2007 09:51 • Verfasst in ABAP® für Anfänger
5
Antw.
2631
Views
Select Abfrage mit Ausschlusskriterien
von tmxx » 01.04.2008 10:34 • Verfasst in ABAP® für Anfänger
3
Antw.
2964
Views
Select Abfrage - For all Entries
von Cargo2 » 09.12.2016 10:56 • Verfasst in ABAP® Core
9
Antw.
3785
Views
spezielle select-abfrage
von TobiB » 30.11.2007 16:29 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

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.