我们经常会遇到想要把一对多关系转换成为一对一关系,以方便显示。例如有如下关系:
Class(ClassID,ClassName)和Student(SID,SName,ClassID),并且,这两个关系存在以下测试数据:
Class:
Student:
031231301
|
张三
|
001
|
031231301
|
张三
|
002
|
031231302
|
李四
|
001
|
那么,这两个关系表达的意思:选语文的有张三和李四;选数学的有李四。如果想做一个视图(V_STU_CLA)来表达这种一对多关系(一门课程,被多个学生所选择),可以使用一个简单的左联语句来完成:
得到的结果如下:
SELECT C.ClassID, C.ClassName, S.SName FROM Class C
LEFT JOIN Student S ON C.ClassID=S.ClassID;
ClassID
|
ClassName
|
SName
|
001
|
语文
|
张三
|
001
|
语文
|
李四
|
002
|
数学
|
张三
|
这样虽然能够清晰的表达选课关系,但是,某些情况下,它不如下面这种形式来得一目了然:
ClassID
|
ClassName
|
SNames
|
001
|
语文
|
张三,李四
|
002
|
数学
|
张三
|
要达到这样的目的,需要完成一个一对多关系到一对一关系的转换。这样的转换,在数据库中,可以借助函数来进行,因为函数中应用到了游标,故对于Oracle和MSSQL稍有不同,附上两个版本的函数SQL代码:
MS-SQL版:
--根据课程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 Class C
LEFT JOIN Student S 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 Class C
LEFT JOIN Student S 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;
MS-SQL调用时,通过以下语句实现:
ORACLE中调用方法类似。
SELECT C.ClassID, C.ClassName, dbo.f_getStuNamesByClassID(C.ClassID)
FROM Class C;
分享到:
相关推荐
### SQL函数详解——基于Oracle数据库 #### 一、概述 SQL函数是数据库系统为了方便用户进行数据处理而提供的一系列内置函数。Oracle数据库作为业界领先的数据库管理系统之一,提供了丰富的SQL函数来支持各种复杂的...
#### 第四天:函数——对数据的进一步处理 - **汇总函数**: - **COUNT**:计数函数,用于统计行数。 - **SUM**:求和函数,用于计算数值字段的总和。 - **AVG**:平均值函数,计算数值字段的平均值。 - **MAX**...
Oracle 内置 SQL 函数是数据库管理系统中非常重要的组成部分,它们提供了一种简洁的方式来处理数据,包括转换、格式化和操作各种数据类型。在Oracle中,这些函数分为多个类别,如字符函数、数字函数、日期函数、转换...
本文将详细解析一个具体的SQL函数实现——`F_GetHelpCode`,该函数用于从输入的中文字符串中提取拼音,并返回一个由拼音组成的字符串。 #### 函数定义 `ALTER FUNCTION [dbo].[F_GetHelpCode] (@cName VARCHAR(20)...
本文将详细介绍一个在SQL Server中实现的将汉字转换成全拼形式的函数——`fn_GetQuanPin`。 #### 函数概述 此函数名为`[dbo].[fn_GetQuanPin]`,它接收一个长度不超过100个字符的字符串作为输入,并返回一个最大...
根据提供的文件信息,本文将对MySQL中的常用函数进行详细的解读与总结。这些函数涵盖了字符串处理、数值转换等多个方面,对于数据库开发与维护人员来说是非常重要的工具。下面将逐一解析每个函数的功能及其用法。 #...
SQL是Structured Query Language的缩写,是用于管理关系数据库的标准语言。在数据分析中,SQL扮演着至关重要的角色,它能够帮助我们对数据进行增、删、改、查等操作,从而进行有效的数据处理和分析。以下是对SQL核心...
标题《SQL Server2008的T—SQL新功能——小功能有大用途》揭示了SQL Server 2008在T-SQL(Transact-SQL)语言中增加的一些新特性,虽然它们可能不像其他大型功能那样引人注目,但它们却在日常数据处理中扮演了重要的...
- **聚合函数**:COUNT、SUM、AVG、MAX和MIN等用于对一组值进行计算。 - **GROUP BY和HAVING子句**:用于数据分组和筛选分组后的结果。 3. **数据插入与更新** - **INSERT语句**:向表中插入新记录,如`INSERT ...
- **函数**:提供了一系列内置函数,如数学函数、字符串函数、日期时间函数等,简化常见计算和转换操作。 - **流程控制语句** - **BEGIN...END**:用于定义代码块。 - **IF...ELSE**:根据条件执行不同的语句或...
在本课程中,我们将深入探讨SAP ABAP中的一个重要概念——动态SQL,这对于任何希望成为专业ABAP开发人员的人来说都是必不可少的知识。SAP ABAP(Advanced Business Application Programming)是SAP系统中用于开发...
1.4.11 First函数——返回查询结果的第一个记录 55 1.4.12 FirstDayOfWeek属性——获取或设置一周中的第一天 56 1.4.13 Format方法——格式化字符串 56 1.4.14 GETDATE函数——返回当前系统日期和时间 58 1.4.15 ...
#### 第四天:函数——对数据的进一步处理 SQL提供了丰富的内置函数,用于执行各种数据处理任务。这部分内容详细讲解了几类主要函数的应用,包括: - **汇总函数**:如COUNT(计算行数)、SUM(求和)、AVG(平均...
将K-means算法用SQL语言实现,不仅解决了算法与关系型数据库集成的问题,还充分利用了SQL的广泛可用性和对DBMS内部机制的隔离优势。此外,对于存储在关系数据库中的大量数据集而言,这提供了一个便捷的平台来进行...
本文介绍的自定义SQL Server函数即实现了一种特殊的修约规则——“四舍六入五单进”的修约方法,并且已经在实际项目中经过验证并投入使用。 #### 四舍六入五单进修约规则解析 所谓的“四舍六入五单进”,是一种...
SQL Server是一种广泛使用的关系型数据库管理系统,由微软公司开发,旨在提供高效的数据存储、管理和分析能力。本电子教案是专为对SQL Server感兴趣的学习者设计的,内容实用且易于理解,适合初学者入门和进阶者提升...