Sql Oracle查询基于列值返回一行
我目前有一个查询,在WHERE子句中为应用程序选择多行数据:Sql Oracle查询基于列值返回一行,sql,oracle,plsql,Sql,Oracle,Plsql,我目前有一个查询,在WHERE子句中为应用程序选择多行数据: SELECT APP_NAME, NAME, ROLE FROM APP_PERSON WHERE APP_NAME='ABCD' ORDER BY APP_NAME,NAME 这将返回: ABCD Bob Executive Director ABCD Kim Director ABCD Sara Associate Director ABCD Tim
SELECT
APP_NAME,
NAME,
ROLE
FROM APP_PERSON
WHERE APP_NAME='ABCD'
ORDER BY APP_NAME,NAME
这将返回:
ABCD Bob Executive Director
ABCD Kim Director
ABCD Sara Associate Director
ABCD Tim VP
我想让它返回一行,其中的人是标题最低的“角色”。顺序是:副董事、董事、执行董事、副总裁(这是唯一的选择)
因此,对于上面的示例,我希望返回的唯一一行是:
ABCD Sara Associate Director
如果没有副主任的话,我想当主任。我如何创建一个查询来实现这一点。我假设是某种解码,但不确定该去哪里。谢谢你的帮助 顺序是:副董事、董事、执行董事、副总裁(这是唯一的选择)
我希望下面的查询将为您提供答案
SELECT
APP_NAME,
NAME,
ROLE
FROM APP_PERSON
WHERE APP_NAME='ABCD'
ORDER BY APP_NAME,NAME
where rownum = 1
order by ROLE
解决这个问题的方法不止一种。我更愿意明确地加入优先级,然后使用
行数()
选择您想要的行:
select app_name, name, role
from (SELECT APP_NAME, NAME, ROLE,
ROW_NUMBER() over (partition by app_name order by priority) as seqnum
FROM APP_PERSON p join
(select 'Associate Director' as role, 1 as priority from dual union all
select 'Director', 2 from dual union all
select 'Executive Director', 3 from dual union all
select 'VP', 4 from dual
) r
on p.role = r.role
) t
WHERE APP_NAME='ABCD' and seqnum = 1
ORDER BY APP_NAME, NAME
使用这样的公共表表达式如何:
WITH cte AS (
SELECT
app_name
,name
,role
,MIN(CASE role
WHEN 'Associate Director' THEN 1
WHEN 'Director' THEN 2
WHEN 'Executive Director' THEN 3
WHEN 'VP' THEN 4) AS role_level
FROM app_person
WHERE app_name='ABCD'
)
SELECT
r.*
FROM cte r
INNER JOIN (
SELECT
name
,MIN(role_level) AS role_level
FROM cte rl
GROUP BY name) ON r.name = rl.name AND r.role_level = rl.role_level
ORDER BY
r.app_name
,r.name
干净的方法(和NF)是创建一个角色表,向其中添加一个“层次结构级别”列,然后加入。如果可能的话,我不想对数据库做任何更改。谢谢你的猜测:在未来两年内,你会后悔的。它只是按字典顺序对值进行排序,不是吗?是的,这个案例符合OP的要求。我真的希望这样做,无论角色是什么,都能奏效。事实上,它们是按字母顺序排列的,可能并不总是如此。感谢设置错误:“ORA-00923:FROM关键字未在预期位置找到”。试图解决这个问题,看起来是一个很有希望的解决方案option@adaher23 . . . 我遗漏了duals中的一个cuople
。我怀疑它是否能在Oracle上运行