@Prosecutorr

Oracle. Как вернуть правильную запись на основе значений полей?

Имеется селект, который вытаскивает запись базируюсь на масимальном значения 1-го полня

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

Мои знания не велики, по этому обращаюсь к Вам.

Мне нужно принять во внимания ещё некоторые поля

  1. Если существуют записи где `festpae_id is NULL`, тогда нужна проверка на `festpae_id is NULL` and `value = 1`, соответсвенно он должен вернуть запись где discount 40( в данном случае)
  2. Если не существует записей где `festpae_id is null`, тогда он должен смотреть на макисмальное `(festpae_id)` (iв данном случае использую ROW_NUMBER() ) и `value = 1`.
  3. Во всех других случаях он должен возвращать пустоту.



Знаю что можно использовать DECODE(), но тогда это всё превращается в ужас. Может ли кто-то помочь? Уже думаю над этим более 5 часов и никак...

P.S Этот селект испольуезстя в таблице view как `LEFT OUTER JOIN`.
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Terran37
Программист
Вы не пытайтесь решить эту задачу в лоб. Смотрите, у вас узкое место связано с последним условием. Разделите его на два условия, первое берём максимальное из значений или если значение null, то поиск по второму условию.
Тут важно понимать, что бы они не отработали у вас одновременно. Ещё один из вариантов обернуть данный запрос, если о у вас в функции, конечно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы