Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle查询基于列值返回一行_Sql_Oracle_Plsql - Fatal编程技术网

Sql Oracle查询基于列值返回一行

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

我目前有一个查询,在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    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上运行