Из предыдущего поста кто-то уже помог и помог мне создать этот выбор, который возвращает 1 запись по макс. festpae_id
SELECT *
FROM
(
SELECT discount, osp_id, sero_id, estpt_id,
ROW_NUMBER() OVER
(PARTITION BY osp_id, sero_id, estpt_id ORDER BY festpae_id DESC) as festpae_id
FROM database1 data1
JOIN database2 data2 ON data2.id = data1.attr_id
WHERE data1.interest_rate = 1
AND data1.ordet_id = data2.id
AND data1.objt_attr_id = data2.objt_attr_id
)
WHERE festpae_id = 1
Записи:
DISCOUNT OSP_ID SERO_ID ESTPT_ID FESTPAE_ID VALUE
---------- ---------- ---------- ---------- ---------- ----------
50 619356 3931831 2144 NULL 0
40 619356 3931831 2144 NULL 1
30 619356 3931831 2144 2000743 0
15 619356 3931831 2144 2000744 1
Итак, из этого выбора я получу эту запись
DISCOUNT OSP_ID SERO_ID ESTPT_ID FESTPAE_ID VALUE
---------- ---------- ---------- ---------- ---------- ----------
50 619356 3931831 2144 NULL 0
Пока у меня больше условия должны быть проверены, и мой разум взорван, плюс мои oracle знания недостаточно хороши.
Так что мне нужно? Как видите, есть 2 столбца с именами value
и festpae_id
. Они должны быть приняты в состояние.
- Если записи существуют там, где
festpae_id is NULL
, тогда он должен проверить все записи, где festpae_id is NULL
и value = 1
, и вернуть запись, если существует. - Если нет записей, где
festpae_id is null
, затем select должен вернуть запись с MAX(festpae_id)
(в этом случае используется ROW_NUMBER ()) и где value = 1
. - В других случаях select не должен возвращать ничего.
Я знаю, что это можно сделать через DECODE()
, но тогда мне нужно скопировать и вставить код, который не в порядке. Может быть, кто-то из вас может быть так добр и поделиться своими мыслями о решении? Работаем над этим не менее 5 часов и не можем найти способ, как это сделать.
PS Этот выбор используется в таблице представлений как LEFT OUTER JOIN
.