表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可以解决么?
求教

解决方案 »

  1.   


    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
      

  2.   

    你的表设计的有问题,其它表应该用第一个表的ID而不是CARD。表设计应该符合三个范式(Normal Form).
      

  3.   

    --方法一:
    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)
      

  4.   


    --一般我喜欢写函数来做
    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;