我们经常会遇到想要把一对多关系转换成为一对一关系,以方便显示。例如有如下关系:
Class(ClassID,ClassName)和Student(SID,SName,ClassID),并且,这两个关系存在以下测试数据:
Class:
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
|
数学
|
张三
|
要达到这样的目的,需要完成一个一对多关系到一对一关系的转换。这样的转换,在数据库中,可以借助函数来进行,因为函数中应用到了游标,故对于Oracle和MSSQL稍有不同,附上两个版本的函数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;
)
opencur;
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
ResultVARCHAR2(4000);
begin
--通过游标,查找并拼接此课程下的学生姓名
FORCURIN
(
SELECTS.SNameFROMClassC
LEFTJOINStudentSONC.ClassID=S.ClassID
WHEREC.ClassID=@ClassID;
)
LOOP
Result:=Result||CUR.SName||',';
ENDLOOP;
--去掉最后一个逗号
Result:=SUBSTR(Result,0,LENGTH(Result)-1);
return(Result);
end;
分享到:
相关推荐
1.4.11 First函数——返回查询结果的第一个记录 55 1.4.12 FirstDayOfWeek属性——获取或设置一周中的第一天 56 1.4.13 Format方法——格式化字符串 56 1.4.14 GETDATE函数——返回当前系统日期和时间 58 1.4.15 ...
轻举技术之“纲”,张合用之“目”,锻造SQL高可用性数据库应用指南从理论到实践,凝聚SQL主流数据库最前沿的技术要领,本书将深入浅出讨论。 本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在...
在研究一些被其他专门讨论Oracle SQL语言的参考书直接忽略的问题时,这种对Oracle数据库的长期钻研无疑是一个巨大的优势。 ——亚马逊读者评论 目录 第1章 SQL核心 1 1.1 SQL语言 1 1.2 数据库的接口 2 1.3 SQL*...
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语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子...
作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...
如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要...
SQL Server 2008商业智能完美解决方案 3/3 SQL Server 2008 2010 商业智能完美解决方案 作者:兰吉特(Lynn Langit) 出版社:人民邮电出版社; 第1版 (2010年8月1日) ISBN:7115231117, 9787115231116 页码:545 ...
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...
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...
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查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所...
书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所...
SQL Server 2008商业智能完美解决方案 3/3 SQL Server 2008 2010 商业智能完美解决方案 作者:兰吉特(Lynn Langit) 出版社:人民邮电出版社; 第1版 (2010年8月1日) ISBN:7115231117, 9787115231116 页码:545 ------...
《SQL Server 2008商业智能完美解决方案》结合专家团队提供的实际示例和丰富经验进行介绍,让读者能够直观轻松地掌握构建商业智能(BI)解决方案的概念、工具和技术,是一本不可多得的商业智能开发参考指南。...
SQL Server 2008商业智能完美解决方案 2/3 SQL Server 2008 2010 商业智能完美解决方案 作者:兰吉特(Lynn Langit) 出版社:人民邮电出版社; 第1版 (2010年8月1日) ISBN:7115231117, 9787115231116 页码:545 ------...
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 正则...
利用该层将结构查询语言(GeoSQL)转化成标准的SQL查询 借助索引数据的辅助关系实施空间索引操作 全关系型管理分类 2 (1)基于关系模型方式: 图形数据都按照关系数据模型组织 涉及一系列关系连接运算,相当费时 ...