建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

当前位置: 建站学 > 数据库 > Oracle教程 >

如何在Oracle中连接输出结果

时间:2011-07-14 09:10来源: 作者: 点击:
  下图是对一个视图(视图代码附后,全部操作是在Oracle 10g中的HR schema中完成的)进行查询得到的常见的结果。 department ename   marketing  hartstein marketing  fay purchasing raphaely purchasing khoo ... it         hunold it   

  下图是对一个视图(视图代码附后,全部操作是在Oracle 10g中的HR schema中完成的)进行查询得到的常见的结果。

department ename
 

marketing  hartstein

marketing  fay

purchasing raphaely

purchasing khoo

...

it         hunold

it         ernst

...

   但是也可能遇到需要下面这样的结果。

department ename
 

purchasing 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) employees
FROMd_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()方法。

 

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片