神谕。 Return 根据字段值正确记录

Oracle. Return correct record based on fields values

从之前的 post 开始,有人已经提供了帮助并帮助我创建了这个 select,最多 returns 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

所以从那个select,我会得到这个记录

DISCOUNT     OSP_ID    SERO_ID   ESTPT_ID FESTPAE_ID   VALUE
---------- ---------- ---------- ---------- ---------- ----------
      50     619356    3931831       2144    NULL       0

目前条件比较多 需要检查一下,脑子已经炸了,再加上我的oracle知识还不够好。

那我需要什么?如您所见,有 2 列,分别称为 valuefestpae_id。他们必须得到妥善处理。

  1. 如果 festpae_id is NULL 处存在记录,那么他应该检查 festpae_id is NULLvalue = 1 处的所有记录,如果存在 return 记录。
  2. 如果festpae_id is null处没有记录,那么select应该return带有MAX(festpae_id)的记录(在本例中使用ROW_NUMBER() ) 以及 value = 1.
  3. 在其他情况下,select 应该 return 没有。

我知道,可以通过 DECODE() 完成,但我需要复制粘贴代码 不行。也许你们中的某个人可以如此友善并分享他对解决方案的想法?现在为此至少工作了 5 个小时,但找不到制作方法。

P.S 此 select 在视图 table 中用作 LEFT OUTER JOIN

只需调整 order by 并将 value = 1 添加到 WHERE:

      (PARTITION BY osp_id, sero_id, estpt_id
       ORDER BY (CASE WHEN festpae_id IS NULL
                      THEN 1 ELSE 2
                 END),
                festpae_id DESC
      ) as festpae_id 

并且:

WHERE data1.interest_rate AND value = 1

您还可以添加WHERE条件并将ORDER BY简化为ORDER BY testpae_id DESC NULLS FIRST