Вы пометили свой запрос PL / SQL, поэтому я полагаю, что вашей СУБД может быть Oracle.
Если я правильно понимаю, таблица MDPRSVK содержит несколько цен на ART_ID. И вы хотите выбрать лучшую цену каждого ART_ID (от лучшей к худшей: «KA» -> «KW» -> «A» -> «W» -> любая другая PREIS_EBENE).
Для этого вы можете использовать оконную функцию (ROW_NUMBER
, RANK
или DENSE_RANK
):
select *
from mdprsvk
order by row_number()
over (partition by art_id
order by decode(preis_ebene, 'KA', 1, 'KW', 2, 'A', 3, 'W', 4, 5))
fetch first row with ties;
Это стандартный SQL. В Oracle FETCH FIRST
доступен начиная с версии 12c. В более ранних версиях вы использовали вместо этого подзапрос:
select *
from
(
select
mdprsvk.*,
row_number() over (partition by art_id
order by decode(preis_ebene, 'KA', 1, 'KW', 2, 'A', 3, 'W', 4, 5))
as rn
from mdprsvk
)
where rn = 1;
Или используйте Oracle s
KEEP FIRST`:
select art_id, max(betrag)
keep (dense_rank first
order by decode(preis_ebene, 'KA', 1, 'KW', 2, 'A', 3, 'W', 4, 5))
from mdprsvk
group by art_id;
Не ясно, как MDART вступает в игру. Похоже, вы хотите ограничить свои результаты статьями для определенных клиентов, а KENNUNG_USER - это столбец в MDART, который нужно проверить. Если это так, добавьте предложение WHERE
:
where exists
(
select *
from mdart
where mdart.klient_id = mdprsvk.klient_id
and mdart.art_id = mdprsvk.art_id
and icp_kz.is_set(mdart.kennung_user, 'p') = 1
)
Или с IN
вместо EXISTS
:
where (klient_id, art_id) in
(
select klient_id, art_id
from mdart
where icp_kz.is_set(kennung_user, 'p') = 1
)