`

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

阅读更多

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

Class:

001

语文

002

数学

Student

031231301

张三

001

031231301

张三

002

031231302

李四

001

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

SELECTC.ClassID,C.ClassName,S.SNameFROMClassC
LEFTJOINStudentSONC.ClassID=S.ClassID;

ClassID

ClassName

SName

001

语文

张三

001

语文

李四

002

数学

张三

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

ClassID

ClassName

SNames

001

语文

张三,李四

002

数学

张三

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

MS-SQL版:

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

SELECTC.ClassID,C.ClassName,dbo.f_getStuNamesByClassID(C.ClassID)
FROMClassC;
--根据课程ID,返回选此课程的学生的名字,以逗号隔开
CREATEfunctiondbo.f_getStuNamesByClassID(@ClassIDint)
RETURNSnvarchar(512
)
begin

declare@Resultnvarchar(512);
declare@stuNamenvarchar(256
);
Set@Result=''
;

declarecurcursorfor

(
SELECTS.SNameFROMClassC
LEFTJOINStudentSONC.ClassID=
S.ClassID
WHEREC.ClassID=@ClassID
;
)
open
cur;
fetchnextfromcurinto@stuName
;
while(@@fetch_status=0
)
begin

set@Result=@Result+@stuName+',';
fetchnextfromcurinto@stuName
;
end
;
--去除最后多余的一个逗号

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

SET@Result=NULL;
return@Result
;
end


ORACLE版:

createorreplacefunctionFUN_GET_STUNAMES_BY_CLASSID(P_CLASSIDINVARCHAR2)returnvarchar2is
Result
VARCHAR2(4000);
begin

--通过游标,查找并拼接此课程下的学生姓名
FORCURIN
(
SELECTS.SNameFROM
ClassC
LEFTJOINStudentSONC.ClassID=
S.ClassID
WHEREC.ClassID=@ClassID
;
)
LOOP
Result:
=Result||CUR.SName||','
;
END
LOOP;
--去掉最后一个逗号

Result:=SUBSTR(Result,0,LENGTH(Result)-1);
return
(Result);
end
;
分享到:
评论

相关推荐

    C#全能速查宝典

    1.4.11 First函数——返回查询结果的第一个记录 55 1.4.12 FirstDayOfWeek属性——获取或设置一周中的第一天 56 1.4.13 Format方法——格式化字符串 56 1.4.14 GETDATE函数——返回当前系统日期和时间 58 1.4.15 ...

    程序员的SQL金典.rar

    轻举技术之“纲”,张合用之“目”,锻造SQL高可用性数据库应用指南从理论到实践,凝聚SQL主流数据库最前沿的技术要领,本书将深入浅出讨论。  本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在...

    Oracle SQL高级编程

    在研究一些被其他专门讨论Oracle SQL语言的参考书直接忽略的问题时,这种对Oracle数据库的长期钻研无疑是一个巨大的优势。  ——亚马逊读者评论 目录 第1章 SQL核心 1 1.1 SQL语言 1 1.2 数据库的接口 2 1.3 SQL*...

    程序员的SQL金典4-8

     1.2.9 数据库的语言——SQL  1.2.10 DBA与程序员 第2章 数据表的创建和管理  2.1 数据类型  2.1.1 整数类型  2.1.2 数值类型  2.1.3 字符相关类型  2.1.4 日期时间类型  2.1.5 二进制类型  2.2 通过SQL...

    达梦数据库_SQL语言手册

    达梦数据库_SQL语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    PLSQLDeveloper下载

    如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要...

    SQL Server 2008 商业智能完美解决方案(3)

    SQL Server 2008商业智能完美解决方案 3/3 SQL Server 2008 2010 商业智能完美解决方案 作者:兰吉特(Lynn Langit) 出版社:人民邮电出版社; 第1版 (2010年8月1日) ISBN:7115231117, 9787115231116 页码:545 ...

    程序员的SQL金典6-8

     1.2.9 数据库的语言——SQL  1.2.10 DBA与程序员 第2章 数据表的创建和管理  2.1 数据类型  2.1.1 整数类型  2.1.2 数值类型  2.1.3 字符相关类型  2.1.4 日期时间类型  2.1.5 二进制类型  2.2 通过SQL...

    程序员的SQL金典7-8

     1.2.9 数据库的语言——SQL  1.2.10 DBA与程序员 第2章 数据表的创建和管理  2.1 数据类型  2.1.1 整数类型  2.1.2 数值类型  2.1.3 字符相关类型  2.1.4 日期时间类型  2.1.5 二进制类型  2.2 通过SQL...

    程序员的SQL金典3-8

     1.2.9 数据库的语言——SQL  1.2.10 DBA与程序员 第2章 数据表的创建和管理  2.1 数据类型  2.1.1 整数类型  2.1.2 数值类型  2.1.3 字符相关类型  2.1.4 日期时间类型  2.1.5 二进制类型  2.2 通过SQL...

    SQLServer2008查询性能优化 2/2

    书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所...

    SQLServer2008查询性能优化 1/2

    书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所...

    SQL Server 2008商业智能完美解决方案 3/3

    SQL Server 2008商业智能完美解决方案 3/3 SQL Server 2008 2010 商业智能完美解决方案 作者:兰吉特(Lynn Langit) 出版社:人民邮电出版社; 第1版 (2010年8月1日) ISBN:7115231117, 9787115231116 页码:545 ------...

    SQL Server 2008商业智能完美解决方案 1/3

    《SQL Server 2008商业智能完美解决方案》结合专家团队提供的实际示例和丰富经验进行介绍,让读者能够直观轻松地掌握构建商业智能(BI)解决方案的概念、工具和技术,是一本不可多得的商业智能开发参考指南。...

    SQL Server 2008商业智能完美解决方案 2/3

    SQL Server 2008商业智能完美解决方案 2/3 SQL Server 2008 2010 商业智能完美解决方案 作者:兰吉特(Lynn Langit) 出版社:人民邮电出版社; 第1版 (2010年8月1日) ISBN:7115231117, 9787115231116 页码:545 ------...

    php网络开发完全手册

    7.3.4 字符串单词数的计算函数—— 7.3.4 str_word_count 107 7.3.5 字符串查找操作——strstr 108 7.3.6 获得字符串的长度——strlen 108 7.3.7 获得字符串的子串——substr 109 7.4 正则表达式简介 109 7.5 正则...

    5.4空间数据库管理系统.pdf

    利用该层将结构查询语言(GeoSQL)转化成标准的SQL查询 借助索引数据的辅助关系实施空间索引操作 全关系型管理分类 2 (1)基于关系模型方式: 图形数据都按照关系数据模型组织 涉及一系列关系连接运算,相当费时 ...

Global site tag (gtag.js) - Google Analytics