2013-04-16 45 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

相關問題