oracle根据优先级选择

时间:2016-05-04 15:53:55

标签: sql oracle select operator-precedence

我试图重写一些看起来特别糟糕的旧SQL查询。我想知道是否有一种更有效的方法来确定优先顺序的where语句中的值的优先级。基本上,该表包含每个用户的多个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');

3 个答案:

答案 0 :(得分:1)

尝试:

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

答案 1 :(得分:0)

唉我这里没有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

答案 2 :(得分:0)

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