2013-04-16 46 views
0

我目前有在WHERE子句中的应用选择多行数据的查询:Oracle查询返回一个基于列的行值

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 

如果不是一个副主任,我想导演。我如何创建一个能够做到这一点的查询。我假设某种DECODE,但不知道该去哪里。谢谢你的帮助!

+3

的清洁方式(和NF)是创建一个角色表,添加一个“层次级”列,然后加入。 –

+0

如果可能,我想不必对数据库进行任何更改。谢谢 – ad2387

+0

只是一个猜测:你会后悔在2年内。 –

回答

2

有多种方法可以解决这个问题。我宁愿在优先明确加入,然后用row_number()选择您想要的行:

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 
+0

+1更好的答案,干净的答案! – Luv

+0

获取错误:'ORA-00923:FROM keyword not found where expected'。试图对其进行排序,看起来像一个有前途的选项 – ad2387

+0

@ adaher23。 。 。我从双重身上遗漏了一个人。 –

0

顺序云:副总监,总监,执行董事,副总裁(这是唯一的选项)

我希望下面的查询将为您提供答案。

SELECT 
    APP_NAME, 
    NAME, 
    ROLE 
FROM APP_PERSON 
WHERE APP_NAME='ABCD' 
ORDER BY APP_NAME,NAME 
where rownum = 1 
order by ROLE 
+0

它只是按照字典顺序排列值,不是吗? –

+0

是的,这种情况将符合OP的要求。 – Luv

+0

我真的很喜欢这样做,无论角色是什么,都可以工作。他们按字母顺序排列的事实并不总是如此。谢谢 – ad2387

0

如何使用公共表expresion像这样:

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 
+0

我怀疑它是否会在** Oracle **上运行 – Luv

相关问题