wymaganie jest takie, żeby zwrócić wszystkie wpisy z tabeli, które mają nieprzetworzony komunikat wyjściowy. Możliwe sytuacje takie, że jeden wpis z błędem (status=2), ale też może być kolejny wpis z status=1, co oznacza że jest OK i taki wpis nie powinien się pokazać na wyniku. W tabeli mam kilka wpisów ze statusem=2, select nic nie zwraca bo nie ma żadnego wpisu z status=1:
SELECT ekbe~ebeln, ekbe~belnr, nast~vstat FROM ekbe
JOIN nast ON ekbe~belnr = nast~objky
WHERE ekbe~ebeln IN @s_ebeln AND
nast~kappl = 'V2' AND
nast~kschl = 'SPED' AND
nast~vstat = '2' AND
( ekbe~ebeln NOT IN
( SELECT ekbe~ebeln FROM ekbe
JOIN nast ON ekbe~belnr = nast~objky
WHERE ekbe~ebeln IN @s_ebeln AND
nast~kappl = 'V2' AND
nast~kschl = 'SPED' AND
nast~vstat = '1' ) )
INTO TABLE @lt_data.
Na oko ten select wygląda ok. Natomiast nie napinałbym się, aby to obsłużyć jednym select'em. Może to nie jest super optymalne, ale wolę prostsze select'y i przetwarzanie w tablicach wewnętrznych. Jakoś łatwiej mi się tak debuguje.
A w jakim celu robisz dodatkowego INNER JOIN, jeśli łączysz po tym samym kluczu (ON) i w warunkach WHERE jest to samo?
Dlaczego nie napiszesz po prostu:
Pierwszy : nast~vstat EQ '1'
Drugi: nast~vstat EQ '2'
Cel jest taki: zwrócić takie zamówienia, które nie mają poprawnie wygenerowanego komunikatu SPED. Wpisy w NAST mogą być różne, które powinny być odczytane: kilka wpisów tylko z błędem 1, albo kilka wpisów z błędem 1, a jeden wpis z '2' (stąd cały ambaras żeby ich nie pokazywać).
SELECT ekbe~ebeln, ekbe~belnr, nast~vstat FROM ekbe
left outer JOIN nast ON ekbe~belnr = nast~objky
WHERE ekbe~ebeln IN @s_ebeln AND
nast~kappl = 'V2' AND
nast~kschl = 'SPED' AND
nast~vstat = '2' AND
( ekbe~ebeln NOT IN
( SELECT ekbe~ebeln FROM ekbe
JOIN nast ON ekbe~belnr = nast~objky
WHERE ekbe~ebeln IN @s_ebeln AND
nast~kappl = 'V2' AND
nast~kschl = 'SPED' AND
nast~vstat = '1' ) )
INTO TABLE @lt_data.
nadal nic nie zwraca mimo że są tylko 3 wpisy z STATUS = "2"
SELECT ekbe~ebeln, ekbe~belnr, nast~vstat FROM ekbe
left outer JOIN nast ON ekbe~belnr = nast~objky
WHERE ekbe~ebeln IN @s_ebeln AND
nast~kappl = 'V2' AND
nast~kschl = 'SPED' AND
nast~vstat = '2' AND
SELECT ekbe~ebeln FROM ekbe
JOIN nast ON ekbe~belnr = nast~objky
WHERE ekbe~ebeln IN @s_ebeln AND
nast~kappl = 'V2' AND
nast~kschl = 'SPED' AND
nast~vstat = '1'
with +exclude as (
select distinct ebeln
from ekbe join nast
on ekbe~belnr = nast~objky
where ebeln in @s_ebeln and
kappl = 'V2' and
kschl = 'SPED' and
vstat = '1'
) select ebeln, belnr, vstat
from ekbe join nast
on ekbe~belnr = nast~objky
where ebeln in @s_ebeln and
ebeln not in ( select ebeln from +exclude ) and
kappl = 'V2' and
kschl = 'SPED' and
vstat = '2'
into table @data(stats).
with +exclude as (
select distinct ebeln
from ekbe join nast
on ekbe~belnr = nast~objky
where ebeln in @s_ebeln and
kappl = 'V2' and
kschl = 'SPED' and
vstat = '1'
) select ebeln, belnr, vstat
from ekbe join nast
on ekbe~belnr = nast~objky
where ebeln in @s_ebeln and
ebeln not in ( select ebeln from +exclude ) and
kappl = 'V2' and
kschl = 'SPED' and
vstat = '2'
into table @data(stats).
Pytanie. Co to zmieni, jeśli zapytanie w IN jest NULL, więc cała wartość wyrażenia będzie zapewne FALSE... ale mówię z głowy, bez testów...
with +exclude as (
select distinct ebeln
from ekbe join nast
on ekbe~belnr = nast~objky
where ebeln in @s_ebeln and
kappl = 'V2' and
kschl = 'SPED' and
vstat = '1'
) select ebeln, belnr, vstat
from ekbe join nast
on ekbe~belnr = nast~objky
where ebeln in @s_ebeln and
ebeln not in ( select ebeln from +exclude ) and
kappl = 'V2' and
kschl = 'SPED' and
vstat = '2'
into table @data(stats).
ooo mega, super. Pytanie dodatkowe, potrzebuję wykluczać po wartościach z dwóch pol EKBE-EBELN i EKBE-EBELP (pozycja). Jak w drugim select wykluczyć wartości obu pól jednoczesnie?
-- Jedynie rola Z_NIEZBEDNIK
SELECT uname FROM sapprd.agr_users WHERE agr_name = 'Z_NIEZBEDNIK' AND uname NOT IN ( SELECT uname FROM sapprd.agr_users WHERE agr_name != 'Z_NIEZBEDNIK' );
Nie mam takich danych aby poeksperymentować, ale jak pisałem, warto używać aliasów i explicite deklaracji JOINów...