有表A(pid,operator,fee)
值如下:
5  <  100
7  = 200
10 > 300
表B(pid,pname)
1  tom
2  jack
3  rose
5  mike
6  david
7  owen
10 bill
11 raul要求,就是如果pid的值<5,就返回100;=7,就返回200;>10,就返回300; 其他值就返回0;
也就是两表关联,查询到的最后结果如下:
1  tom      100
2  jack     100
3  rose     100
5  mike     0
6  david    0
7  owen     200
10 bill     0
11 raul     300

解决方案 »

  1.   

    如果分批进行,按照>,=,<三种方式关联表格,然后union,那样自然可以得到结果。
    但这个结果不是我想要的。
    希望能有其他的解决办法。
      

  2.   

    我喜欢这样有想象力的题
    写个函数来处理
    create table a as select 5 pid,'<' operator,100 fee from dual
             union all select 7,'=',200 from dual
             union all select 10,'>',300 from dual;
    create table b as select 1 pid,'tom' pname from dual
             union all select 2,'jack' from dual
             union all select 3,'rose' from dual
             union all select 5,'mike' from dual
             union all select 6,'david' from dual
             union all select 7,'owen' from dual
             union all select 10,'bill' from dual
             union all select 11,'raul' from dual;
    函数
    create or replace function func(num1 in number,
                                    operator in varchar2,
                                    num2 in number)
    return number as
    flag number;
    begin
    execute immediate 'select case when '||num1||operator||num2||' then 1 else 0 end'||chr(13)||
         'from dual' into flag;
    return flag;
    end;
    查询
    select b.pid,b.pname,nvl(a.fee,0)
    from a,b
    where func(b.pid,a.operator(+),a.pid(+))=1
    结果
    PID PNAME NVL(A.FEE,0)
    1 tom 100
    2 jack 100
    3 rose 100
    5 mike 0
    6 david 0
    7 owen 200
    10 bill 0
    11 raul 300
      

  3.   

    用case when 判断一下就行了吧?
      

  4.   

    select b.pid, b.pname, 
       max(decode(a.operator,'<',decode(sign(c.rn - a.pid),-1,a.fee,0),
                         '=',decode(sign(c.rn - a.pid),0,a.fee,0),
                         '>',decode(sign(c.rn - a.pid),1,a.fee,0))) fee                          
    from 
       a, b,
       ( select level rn
         from 
            dual t,  
            ( select min(pid) minpid, max(pid) maxpid from b ) u
              where level >= u.minpid connect by level <= maxpid ) c
    where b.pid = c.rn            
    group by b.pid,b.pname;    
      

  5.   

    感谢 wenyzh,
    你的做法看起来简单,却很适用。
    我最终采取你的方法,不灵活,但是性能够好。
    不过wildwave的方法更灵活些,只是性能有些跟不上。