a表数据格式:
AID INDUSTRY
200001           1
200007          1
100007         2
100001         3b表数据格式:
msisdn     Menu_List
1          100001|200001
2          100001|100007
3          100007|200007
4          100007
5          200007b表的Menu_List由a表的AID组成,我想找出b表的Menu_List中包含a表industry='1'的AID的记录,语句如下:
Select distinct msisdn,Menu_List
FROM a,
(Select aid From b Where industry='1' )  b
where a.menu_list is not null and INSTR(a.Menu_List,b.AID) >  0

解决方案 »

  1.   

    Select distinct msisdn,Menu_List
    FROM a,
    (Select aid From b Where industry='1' )  b
    where a.menu_list is not null and INSTR(a.Menu_List,b.AID) >   0写法是没错的,但是可能有问题.instr前后都加  ,  确保不会匹配到其他的。
    例如menu_list   100001     ;AID   10  。 你的写法就有问题了
    Select distinct msisdn,Menu_List
    FROM a,
    (Select aid From b Where industry='1' )  b
    where a.menu_list is not null and INSTR(','||a.Menu_List||',',','||b.AID||',') >   0
      

  2.   

    都加上空格,未必对.
    要看它Menu_List本身的格式.
    开始的地方,未必有空格,或者逗号.从他写的数据来看,他自己的做法是没有问题的.
      

  3.   

    一楼的写法比较保险一些
    或者直接用like
    Select distinct msisdn,Menu_List 
    FROM a, 
    (Select aid From b Where industry='1' )  b 
    where a.menu_list is not null and '¦'||a.Menu_List||'¦' like '%¦'||nvl(b.AID,'')||'¦%';
      

  4.   

    应该没问题,我的AID都是6为的,MENU_LIST都是由AID组成,用'|'分隔
      

  5.   

    如果B表的MENU_LIST包含多个A表的AID,比如:100001|100007|200007|200001|100002,我这样统计也不会有问题吧?
      

  6.   

    不会的。
    会产生问题的情况是你的aid之间包含
    比如aid  1000,100,10  有这3个值。你的sql找10的时候就会找到1000和100,我的sql不会。
    如果你的aid位数是固定的话,是不会有问题的。
    但是你为什么不把程序写健壮点了?
      

  7.   

    谢谢大家的指教!
    在请教个问题,然后结贴:
    如果要把b表的数据按menu_list分解,每个menu_list只有一个AID,应该怎么写语句呢?比如:
    msisdn     Menu_List 
    1          100001 ¦200001 
    分解为2条记录,
    msisdn     Menu_List 
    1          100001
    1          200001 
    谢谢!
      

  8.   

    参考这个declare 
           str varchar2(100); 
           startposition number(10); 
           len number(10); 
           output varchar2(100); 
    begin 
         str:= 'hello,nick,xingxing '; 
         startposition:=1; 
         loop 
                     select instr(str, ', ',startposition ) into len from dual; 
                     dbms_output.put_line(startposition); 
                     dbms_output.put_line(len); 
                     
                     if len!=0 then  
                       select substr(str,startposition,len-startposition) into output from dual; 
                     else 
                        select substr(str,startposition) into output from dual; 
                        dbms_output.put_line(output); 
                        exit; 
                     end if;   
                     
                     dbms_output.put_line(output); 
                     startposition:=len+1;    
                     dbms_output.put_line( '------------------------------------- ');             
       end loop; 
         
    end;
      

  9.   

    http://topic.csdn.net/u/20080317/11/9b13065e-7b6a-4827-adfe-a8ab0ee9943e.html
    DragonBill的回复。
    如果你的aid长度是6不变的话可以实现。SELECT DISTINCT msisdn      , 
           SUBSTR(Menu_List, INSTR('|' || Menu_List, '|', 1, LEVEL), 2) AS Menu_List
    FROM A
    CONNECT BY LEVEL <= (LENGTH(Menu_List) - LENGTH(REPLACE(Menu_List, '|','')))+1
    ORDER BY msisdn;