Oracle sql union在单个列上没有重复

时间:2012-12-18 14:23:18

标签: sql oracle

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

我的表格AB有两列:item_name, price。我想创建一个视图,对于某些item_names,它会在表A中查看item_name是否存在,如果是,请使用price { {1}},如果没有,请转到A并使用B中的price,然后B union item_name中的B还没有添加到视图中。

例如,

 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

对于shoesocks我想使用table A的价格(如果可用),如果不使用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')是重复的。有更好/更有效的方法吗?

3 个答案:

答案 0 :(得分:7)

我认为你正在寻找加入:

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

答案 1 :(得分: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等中也有相同的功能

答案 2 :(得分: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)

稍微改变了戈登和