表a
id card
1 111
2 222
3 333
表b
card name
111 名称1
333 名称3表c
card name
222 名称2库表如上,
想查询出来的数据是这样的
id card name
1 111 名称1
2 222 名称2
3 333 名称3表a跟表b关联,如果b表有该card的名称,则取b表的名称;
如果没有,表a再跟表c关联,从c表中取名称。
这样的需求,sql可以解决么?
求教
id card
1 111
2 222
3 333
表b
card name
111 名称1
333 名称3表c
card name
222 名称2库表如上,
想查询出来的数据是这样的
id card name
1 111 名称1
2 222 名称2
3 333 名称3表a跟表b关联,如果b表有该card的名称,则取b表的名称;
如果没有,表a再跟表c关联,从c表中取名称。
这样的需求,sql可以解决么?
求教
select t.id,t.card,nvl(t.name,c.name)
from c,(select a.id,
a.card,
b.name
from b,a
where a.card=b.card(+)) t
where t.card=c.card(+)
ID CARD NVL(T
------ ---------- -----
1 111 名称1
3 333 名称3
2 222 名称2
select tab1.id,
tab1.card,
case
when (select count(*) from tab2 where tab2.card = tab1.card) > 0 then
(select tab2.name
from tab2
where tab2.card = tab1.card
and rownum = 1)
else
(select tab3.name
from tab3
where tab3.card = tab1.card
and rownum = 1)
end as name
from tab1
--方法二:
select tab1.id, tab1.card, nvl(tab2.name, tab3.name) as name
from tab1
left join tab2 on (tab1.card = tab2.card)
left join tab3 on (tab3.card = tab1.card)
--一般我喜欢写函数来做
create or replace function getName(v_card in varchar2)
return varchar2
is
result varchar2(100);
begin
begin
select name into result from b where card=v_card;
exception
when no_data_found then
select name into result from c where card=v_card;
end;
return result;
end;--查询:
select id ,card,getname(card) name from a;