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.
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).
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. 😉
Ok übersehen, aber das bedeutet ja "nur" zwei SubSelects oder evtl. geschachtelte SubSelects.
Genau, ohne weiteren Input kann man schlecht helfen....