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