由于不会写Oracle,初学。
特请教一个问题。类似一下代码的求并集,要在一个过程或函数中如何实现。
其中QJID =XX 是传入的参数,使用逗号分隔 例如 1,2这样。SELECT KHBH, ZBBH,khbh
FROM JXKH_T_TZZBXX_R A
WHERE (QJID = 1)
intersect
SELECT KHBH, ZBBH,khbh
FROM JXKH_T_TZZBXX_R B
WHERE (QJID = 2)当然实现就可以,用IN也行,可我不懂Oracle语法,写不出这样要求的过程
特求大侠指点

解决方案 »

  1.   

    SELECT KHBH, ZBBH,khbh 
    FROM JXKH_T_TZZBXX_R A 
    WHERE QJID  in (1,2) ;
      

  2.   

    SELECT KHBH, ZBBH,khbh 
    FROM JXKH_T_TZZBXX_R A 
    WHERE QJID  in (1,2) ; 
      

  3.   

    另一个方法:
    先造一个 转换 ,号隔开的字符为一个表 的函数。create or replace function split
    (
       p_list varchar2,
       p_sep varchar2 := ','
    )  return type_split pipelined
     is
       l_idx  pls_integer;
       v_list  varchar2(32767) := p_list;
    begin
       loop
          l_idx := instr(v_list,p_sep);
          if l_idx > 0 then
              pipe row(substr(v_list,1,l_idx-1));
              v_list := substr(v_list,l_idx+length(p_sep));
          else
              pipe row(v_list);
              exit;
          end if;
       end loop;
       return;
    end split;
    /
    然后就能用下面的 sql.
    :QJID 内容可以为  ,号隔开的 数字。
    SELECT /*+ use_nl(QJIDs A)*/ KHBH, ZBBH,khbh 
    FROM JXKH_T_TZZBXX_R A 
    inner join table(split(:QJID,',')) QJIDs on QJIDs.column_value=A.QJID
      

  4.   

    我晕是我没说清楚吗?where qjid in(1,2) 是在求表交集吗!!!
      

  5.   

    SELECT KHBH, ZBBH,khbh 
    FROM JXKH_T_TZZBXX_R A 
    WHERE QJID  =1 and QJID  =2 ; 这个是交集吧。
      

  6.   

    SELECT KHBH, ZBBH,khbh 
    FROM JXKH_T_TZZBXX_R B 
    WHERE (QJID = 2 or QJID = 1) 
    group by KHBH, ZBBH,khbh having(count(QJID)>1)这个一定是交集
      

  7.   

    或者用我 4楼的那个 函数:
    :QJID 内容可以为  ,号隔开的 数字SELECT /*+ use_nl(QJIDs A)*/ KHBH, ZBBH,khbh 
    FROM JXKH_T_TZZBXX_R A 
    inner join table(split(:QJID,',')) QJIDs on QJIDs.column_value=A.QJID
    group by KHBH, ZBBH,khbh having(count(QJID)>1) 
    就能实现存过程 传一个 ,号隔开的数字 做参数。
      

  8.   

    感谢一下,作为一个oracle初学者,遇到兄弟指点,很是爽。
      

  9.   

     return type_split pipelined
    就是那个逗号分隔的函数 ,怎么好像有问题啊,我也看不懂