oracle select 基于优先级

oracle select based on priority

我正在尝试重写一些看起来特别糟糕的旧 SQL 查询。我想知道是否有更有效的方法来确定 where 语句中值的优先顺序以获得优先顺序。基本上 table 每个用户包含多个 email_code 记录,但我想根据首选记录确定优先级。在这种情况下,如果 email_code 是 WORK,则应选择它。但如果没有 WORK 记录,则应选择 HOME,依此类推。这是我正在使用的示例。必须有更优雅的方式来做到这一点......?

select 
    * 
from 
    email m
where
    status_ind='A'
    and decode(email_code, 'WORK',1,
                           'HOME',2,
                           'ALT1',3,
                           'ALT2',4,5) = (select 
                                          min(decode(email_code, 'WORK',1,
                                                                 'HOME',2,
                                                                 'ALT1',3,
                                                                 'ALT2',4,5)) 
                                        from 
                                          email
                                        where 
                                          email_uid = m.email_uid
                                          and status_ind='A');

尝试:

SELECT * FROM (
   SELECT e.*,
          dense_rank() over (PARTITION BY user_id
            ORDER BY CASE email_code
               WHEN 'WORK' THEN 1
               WHEN 'HOME' THEN 2
               WHEN 'ALT1' THEN 3
               WHEN 'ALT2' THEN 4
               ELSE 5
          END ) As priority
   FROM emails e
   WHERE status_ind='A'
)
WHERE priority = 1

唉,我这里没有 Oracle,但我想你可以使用类似这样的东西

select * from (
    select *,min(decode(email_code, 'WORK',1,
         'HOME',2,'ALT1',3,'ALT2',4,5)) mincode 
         over(partition by (email_uid))
    where status_ind='A'
) where email_code=mincode

首先,最好创建一个查找 table 来保存电子邮件类型及其优先级。然后您可以使用您的邮件 table 加入此查找 table。最后,可以使用 Oracle 分析函数之一(row_number、等级、dense_rank 等)以获得最高优先级。