我试图重写一些看起来特别糟糕的旧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');
答案 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等)以获得最高优先级。