在Oracle中,是否可以执行union
,其中重复条件位于单个列而不是整行?
我的表格A
和B
有两列: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
对于shoe
和socks
我想使用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')
是重复的。有更好/更有效的方法吗?
答案 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)
稍微改变了戈登和