SQL函数——将一对多关系转换成一对一关系

系统 1553 0

我们经常会遇到想要把一对多关系转换成为一对一关系,以方便显示。例如有如下关系:
Class(ClassID,ClassName) Student(SID,SName,ClassID) ,并且,这两个关系存在以下测试数据:

Class:

001

语文

002

数学

Student

031231301

张三

001

031231301

张三

002

031231302

李四

001

那么,这两个关系表达的意思:选语文的有张三和李四;选数学的有李四。如果想做一个视图( V_STU_CLA )来表达这种一对多关系(一门课程,被多个学生所选择),可以使用一个简单的左联语句来完成:
得到的结果如下:

SELECT C.ClassID,C.ClassName,S.SName FROM ClassC
LEFT JOIN StudentS ON C.ClassID = S.ClassID;

ClassID

ClassName

SName

001

语文

张三

001

语文

李四

002

数学

张三

这样虽然能够清晰的表达选课关系,但是,某些情况下,它不如下面这种形式来得一目了然:

ClassID

ClassName

SNames

001

语文

张三 , 李四

002

数学

张三

要达到这样的目的,需要完成一个一对多关系到一对一关系的转换。这样的转换,在数据库中,可以借助函数来进行,因为函数中应用到了游标,故对于 Oracle MSSQL 稍有不同,附上两个版本的函数 SQL 代码:

MS-SQL 版:

MS-SQL 调用时,通过以下语句实现:
ORACLE 中调用方法类似。

SELECT C.ClassID,C.ClassName,dbo.f_getStuNamesByClassID(C.ClassID)
FROM ClassC;
-- 根据课程ID,返回选此课程的学生的名字,以逗号隔开
CREATE function dbo.f_getStuNamesByClassID( @ClassID int )
RETURNS nvarchar ( 512
)
begin

declare @Result nvarchar ( 512 );
declare @stuName nvarchar ( 256
);
Set @Result = ''
;

declare cur cursor for

(
SELECT S.SName FROM ClassC
LEFT JOIN StudentS ON C.ClassID =
S.ClassID
WHERE C.ClassID = @ClassID
;
)
open
cur;
fetch next from cur into @stuName
;
while ( @@fetch_status = 0
)
begin

set @Result = @Result + @stuName + ' , ' ;
fetch next from cur into @stuName
;
end
;
-- 去除最后多余的一个逗号

IF @Result <> ''
SET @Result = SUBSTRING ( @Result , 1 , LEN ( @Result ) - 1
);
ELSE

SET @Result = NULL ;
return @Result
;
end


ORACLE版:

create or replace function FUN_GET_STUNAMES_BY_CLASSID(P_CLASSID IN VARCHAR2 ) return varchar2 is
Result
VARCHAR2 ( 4000 );
begin

-- 通过游标,查找并拼接此课程下的学生姓名
FOR CUR IN
(
SELECT S.SName FROM
ClassC
LEFT JOIN StudentS ON C.ClassID =
S.ClassID
WHERE C.ClassID = @ClassID
;
)
LOOP
Result:
= Result || CUR.SName || ' , '
;
END
LOOP;
-- 去掉最后一个逗号

Result: = SUBSTR(Result, 0 ,LENGTH(Result) - 1 );
return
(Result);
end
;

SQL函数——将一对多关系转换成一对一关系


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论