3

在 Oracle 中,是否可以union在单列而不是整行上执行重复条件?

我有表AB有 2 列:item_name, price. 我想创建一个视图item_names,它肯定会在表格A中查看是否item_name存在,如果存在,则使用pricein A,如果不去B并使用pricein B,那么union其余的item_nameinB尚未添加到视图。

例如,

 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 A's 价格,如果没有,我想使用table 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 中的空值,请使用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 回答