详解如何在Oracle中连接输出结果

2014-11-24 17:39:48 · 作者: · 浏览: 0

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()方法。可以查看下面这个链接:http://asktom.oracle.com/pls/asktom/f p=100:11:::::P11_QUESTION_ID:124812348063