首页  ·  知识 ·  数据库
Oracle中连接输出结果
网友  IT专家网    编辑:德仔   图片来源:网络
下图是对一个视图(视图代码附后,全部操作是在Oracle 10g中的HR schema中完成的)进行查询得到的常见的结果。   &n
下图是对一个视图(视图代码附后,全部操作是在Oracle 10g中的HR schema中完成的)进行查询得到的常见的结果。
        department enamemarketing hartstein
  marketing fay
  purchasing raphaely
  purchasing khoo
  ...
  it hunold
  it ernst
  ...
 
  但是也可能遇到需要下面这样的结果。
        department enamepurchasing raphely,khoo,baida,tobias,himuro,colmenares
  it hunold,ernst,austin,pataballa,lorentz
  marketing hartstein,fay
  CREATEORREPLACEVIEWd_employeeAS
  SELECTd.department_name department,
  e.last_name ename
  FROMdepartments d,
  employees e
  WHEREd.department_id = e.department_idAND
  d.department_nameIN('IT','Marketing','Purchasing');
 
  为此,Tom大师提供了两种解决方案,如下:
  方法一:
  使用静态的SQL从表中选出需要进行连接的所有数据。
  
     CREATEORREPLACEFUNCTIONCONCAT(P_DEPINVARCHAR2)RETURNVARCHAR2IS
  L_STRVARCHAR2(200)DEFAULTNULL;
  L_SEPVARCHAR2(200)DEFAULTNULL;
  BEGIN
  FORRCIN(SELECTENAMEFROMD_EMPLOYEEWHEREDEPARTMENT = P_DEP)LOOP
  L_STR := L_STR || L_SEP || RC.ENAME;
  L_SEP :=',';
  ENDLOOP;
  RETURNL_STR;
  END;
 
使用下列查询语句查询:
         SELECTd.department, hr.concat(d.department) employeesFROMd_employee d
  GROUPBYdepartment;
 
  方法二:
  使用动态SQL,传入关键列(需求中的department)和那一列的一个值,以及需要实际进行连接的列(需求中的ename)以及表。
        CREATEORREPLACEFUNCTIONCONCAT2(P_KEY_NAME INVARCHAR2,
  P_KEY_VAL INVARCHAR2,
  P_OTHER_COL_NAMEINVARCHAR2,
  P_TNAME INVARCHAR2)
  RETURNVARCHAR2AS
  TYPERCISREFCURSOR;
  L_STRVARCHAR2(4000);
  L_SEPVARCHAR2(200);
  L_VALVARCHAR2(4000);
  L_CUR RC;
  BEGIN
  OPENL_CURFOR'select '|| P_OTHER_COL_NAME ||' from '|| P_TNAME ||' where '|| P_KEY_NAME ||' = :x '
  USINGP_KEY_VAL;
  LOOP
  FETCHL_CUR
  INTOL_VAL;
  EXITWHENL_CUR%NOTFOUND;
  L_STR := L_STR || L_SEP || L_VAL;
  L_SEP :=',';
  ENDLOOP;
  CLOSEL_CUR;
  RETURNL_STR;
  END;
 
  使用下列查询语句查询:
        SELECTd.department, concat2('department', d.department,'ename','d_employee')FROMd_employee d
  GROUPBYd.department;
 
   Tom大师还提到,如果你已经确切知道了需要连接显示的字段所包含的值的列表(比如,只包含A、T、L三个值),那么建议使用DECOD()方法
本文作者:网友 来源:IT专家网
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读