2016-03-29 14 views
0

ある表から特定のフィールドのビューを作成しようとしています。制限のため、ビューはこの形式である必要があります。Oracle - 表示、異なる列の値を1つの列に表示

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がより速い結果を出す場合は、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