2016-03-29 69 views
0

我試圖從一個表創建某些字段的視圖。由於受到限制,視圖必須採用此格式。Oracle - 查看,顯示來自不同列的一列值

我們來調用表Employee。如果Category字段中的值爲A,則需要視圖顯示Info1字段。如果Category字段中的值= B,則需要Info2值。

Create View Emp as Select name, category, info from 
    (select name, category, info1 from employee where category='A') 
UNION 
    (select name, category, info2 from employee where category <>'A') 

我的理解是,這可以用一個工會來完成,但我認爲有許多領域和查詢將是長期的一個聯盟。有另一種方法可以達到相同的結果嗎?通過DECODE方法或許?

Name ID Category Info1 Info2 </h1> 
Max 11 A   VIP  Present 
--- 
Sandra 22 A   VIP  XXX 
--- 
Lou 33 B   Regular XXX 
--- 
Pat 44 B   VIP  XXX 
--- 

回答

1

您可能希望case語句

Create View Emp as 
    Select name, category, 
      CASE WHEN category='A' THEN info1 ELSE info2 END as INFO 
    from employee 

,或者你可能需要一個加入

Create View Emp as 
    Select a.name, a.category, b.info1, c.info2 
    from employee a 
    join employee b on (a.name, a.category) = (b.name, b.category) and b.category = 'A' 
    join employee c on (a.name, a.category) = (c.name, c.category) and c.category <> 'A' 

,或者您可以與工會堅持 - 但是如果你做的我都表明工會 - 它會更快。

無論如何,你真正想要的取決於你沒有告訴我們的所有要求。

不要害怕有一個長查詢 - 查詢有多少行真的沒有錯 - 它可以是100行的長度併產生更快的輸出,然後是更小的查詢做同樣的事情。

+0

謝謝您的建議。我沒有想過使用CASE選項。我絕對喜歡這個聯盟。 我的要求很簡單,就是根據類別值顯示不同的列。我會比較UNION ALL和CASE選項之間的性能,如果聯合產生更快的結果,我將使用UNION ALL。謝謝您的幫助。 – user3144072

+0

@ user3144072 - yw - 祝你好運。 – Hogan

0
Create View Emp 
as 
    Select name, 
     category, 
     CASE category WHEN 'A' THEN info1 ELSE info2 END AS info 
    from employee