三个表 A B C
A 有id
B 有Bid, Bname
C 有Cid, Cname
现在插入数据
A  
id
---
001B
Bid  Bname
----
001  Bname1C
Cid, Cname
---
101 Cname1
102 Cname2SQL
select C.Cname
from A,B,C
where A.id = B.Bid
  or A.id = C.Cid为什么结果是
Cname1,Cname2我想实现的功能是取一个名字。
如果B表中有对应纪录就取B.Bname
如果C表中有对应纪录就取C.Cname除了union有没有别的办法,union的话sql太长

解决方案 »

  1.   

    select distinct nvl(b.bname,c.cname)
    from a,b,c
    where a.id=b.id(+)
    and a.id=c.id(+)
      

  2.   

    我想实现的功能是取一个名字。 
    如果B表中有对应纪录就取B.Bname 
    如果C表中有对应纪录就取C.Cname 
    ---------如果B,C表都有取哪个?
      

  3.   

    --使用union all需要合并重复项
    select distinct name from
    (
      select B.Bname name from A,B where A.id = B.Bid
      union all
      select C.Bname name from A,C where A.id = C.Cid
    ) t--使用union自动合并重复项
    select B.Bname name from A,B where A.id = B.Bid
    union
    select C.Bname name from A,C where A.id = C.Cid
      

  4.   

    id(A) -> aidtry it ..
    SQL:
          select distinct
                 A.aid,
                 decode(B.bid,A.aid,B.bname,C.cname) as abc_name
            from A,
                 B,
                 C
           where A.aid = B.bid
              or A.aid = C.cid;
    AID ABC_NAME
    --- --------
    001 bname1
      

  5.   

    为什么是Cname1,Cname2  因为where后的or关键字中有满足条件即出现1 or(0/1后面可以不管了),所以上面的语句等价于 select C.Cname 
    from A,B,C 
    where true; 结果自然是C里面的Cname了。 
    2)要得到想要的结果用Decode是不错的选择~~