3

Oracleではunion、重複条件が行全体ではなく単一の列にある場合に実行できますか?

私はテーブルを持っていAて、Bそれは2つの列を持っています:item_name, price。ある特定のビューを作成して、が存在するかどうかitem_namesをテーブルAで確認します。存在する場合はinを使用し、存在しない場合はinに移動して使用し、残りのinはまだ追加されていません。ビューに。item_namepriceABpriceBunionitem_nameB

例えば、

 Table A                Table B
 ----------------       ----------------
 item_name price        item_name price
 ----------------       ----------------
 shoe      10           shoe      8
 socks     2            socks     4
 shirt     5            t-shirt   3
 gloves    1            glasses   15
                        pants     7

shoeと私は利用可能な場合はの価格socksを使用したいのですが、使用しない場合は使用します。したがって、最終的に、私のビューは次のようになります。table Atable B

 View
 -----------------------
 item_name price source
 -----------------------       
 shoe      10    A
 socks     2     A
 t-shirt   3     B
 glasses   15    B
 pants     7     B

私は試した

 select * from A a
 where item_name in ('shoe', 'socks')
 union
 select * from B b
 where b.item_name not in 
     (select item_name from A
      where item_name in ('shoe', 'socks'))

select * from A where item_name in ('shoe', 'socks')クエリが重複しているので気に入らない。これを行うためのより良い/より効率的な方法はありますか?

4

3 に答える 3

8

私はあなたが参加を探していると思います:

select coalesce(a.item_name, b.item_name) as item_name,
       coalesce(a.price, b.price) as price,
       (case when a.price is not null then 'A' else 'B' end) as source
from a full outer join
     b
     on a.item_name = b.item_name
于 2012-12-18T14:26:57.320 に答える
3

Oracleを使用しているので、次のことをお勧めします。

select NVL(A.ITEM_NAME,B.ITEM_NAME) AS ITEM_NAME, 
NVL(A.PRICE,B.PRICE) AS PRICE 
FROM A as a RIGHT JOIN B as b ON A.ITEM_NAME=B.ITEM_NAME

それが機能する理由を理解するには、NVLなしで試してみてください。結果として正しい結合が得られます。

A_item  A_price     B_item  B_price
shoe    10          shoe    8
socks   2           socks   4
(null)  (null)      glasses 15
(null)  (null)      t-shirt 3
(null)  (null)      pants   7

テーブルAのnull値は必要ないため、NVLを使用します

NVLには、mysql/mssqlなどにも同等の機能があります。

于 2012-12-18T14:41:20.943 に答える
0

これを試して、

    create view viewname as (
    select coalesce(a.item_name, b.item_name) as item_name,
       coalesce(a.price, b.price) as price,
       (case when a.item_name=b.item_name then 'A' else 'B' end) as source
from tablea a right outer join
     tableb b
     on a.item_name = b.item_name)

ゴードンの答えを少し変更しました

于 2012-12-18T14:31:13.407 に答える