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

Class:

001

语文

002

数学

Student

031231301

张三

001

031231301

张三

002

031231302

李四

001

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

SQL函数——将一对多关系转换成一对一关系SELECT C.ClassID, C.ClassName, S.SName FROM Class C
SQL函数——将一对多关系转换成一对一关系
LEFT JOIN Student S ON C.ClassID=S.ClassID;
SQL函数——将一对多关系转换成一对一关系


得到的结果如下:

ClassID

ClassName

SName

001

语文

张三

001

语文

李四

002

数学

张三

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

ClassID

ClassName

SNames

001

语文

张三,李四

002

数学

张三

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

MS-SQL版:

SQL函数——将一对多关系转换成一对一关系--根据课程ID,返回选此课程的学生的名字,以逗号隔开
SQL函数——将一对多关系转换成一对一关系
CREATE function dbo.f_getStuNamesByClassID (@ClassID int)
SQL函数——将一对多关系转换成一对一关系
RETURNS nvarchar(512
)
SQL函数——将一对多关系转换成一对一关系
begin

SQL函数——将一对多关系转换成一对一关系    
declare @Result nvarchar(512);
SQL函数——将一对多关系转换成一对一关系    
declare @stuName nvarchar(256
);
SQL函数——将一对多关系转换成一对一关系    
Set @Result=''
;
SQL函数——将一对多关系转换成一对一关系
SQL函数——将一对多关系转换成一对一关系    
declare cur cursor for

SQL函数——将一对多关系转换成一对一关系    (
SQL函数——将一对多关系转换成一对一关系        
SELECT S.SName FROM Class C
SQL函数——将一对多关系转换成一对一关系        
LEFT JOIN Student S ON C.ClassID=
S.ClassID
SQL函数——将一对多关系转换成一对一关系        
WHERE C.ClassID=@ClassID
;
SQL函数——将一对多关系转换成一对一关系    )
SQL函数——将一对多关系转换成一对一关系    
open
 cur;
SQL函数——将一对多关系转换成一对一关系    
fetch next from cur into @stuName
;
SQL函数——将一对多关系转换成一对一关系    
while(@@fetch_status=0
)
SQL函数——将一对多关系转换成一对一关系    
begin

SQL函数——将一对多关系转换成一对一关系        
set @Result=@Result+@stuName+',';
SQL函数——将一对多关系转换成一对一关系        
fetch next from cur into @stuName
;
SQL函数——将一对多关系转换成一对一关系    
end
;
SQL函数——将一对多关系转换成一对一关系
--去除最后多余的一个逗号

SQL函数——将一对多关系转换成一对一关系
    IF @Result <> '' 
SQL函数——将一对多关系转换成一对一关系        
SET @Result=SUBSTRING(@Result1LEN(@Result)-1
);
SQL函数——将一对多关系转换成一对一关系    
ELSE

SQL函数——将一对多关系转换成一对一关系        
SET @Result=NULL;
SQL函数——将一对多关系转换成一对一关系    
return @Result
;
SQL函数——将一对多关系转换成一对一关系
end


ORACLE版:

SQL函数——将一对多关系转换成一对一关系create or replace function FUN_GET_STUNAMES_BY_CLASSID(P_CLASSID IN VARCHAR2return varchar2 is
SQL函数——将一对多关系转换成一对一关系  Result 
VARCHAR2(4000);
SQL函数——将一对多关系转换成一对一关系
begin

SQL函数——将一对多关系转换成一对一关系  
--通过游标,查找并拼接此课程下的学生姓名
SQL函数——将一对多关系转换成一对一关系
  FOR CUR IN 
SQL函数——将一对多关系转换成一对一关系  (
SQL函数——将一对多关系转换成一对一关系          
SELECT S.SName FROM
 Class C
SQL函数——将一对多关系转换成一对一关系        
LEFT JOIN Student S ON C.ClassID=
S.ClassID
SQL函数——将一对多关系转换成一对一关系        
WHERE C.ClassID=@ClassID
;
SQL函数——将一对多关系转换成一对一关系  ) 
SQL函数——将一对多关系转换成一对一关系  LOOP
SQL函数——将一对多关系转换成一对一关系      Result :
= Result||CUR.SName||','
;
SQL函数——将一对多关系转换成一对一关系  
END
 LOOP;
SQL函数——将一对多关系转换成一对一关系  
--去掉最后一个逗号

SQL函数——将一对多关系转换成一对一关系
  Result:=SUBSTR(Result,0,LENGTH(Result)-1);
SQL函数——将一对多关系转换成一对一关系  
return
(Result);
SQL函数——将一对多关系转换成一对一关系
end
;
SQL函数——将一对多关系转换成一对一关系

MS-SQL调用时,通过以下语句实现:

SQL函数——将一对多关系转换成一对一关系SELECT C.ClassID, C.ClassName, dbo.f_getStuNamesByClassID(C.ClassID) 
SQL函数——将一对多关系转换成一对一关系
FROM Class C;
SQL函数——将一对多关系转换成一对一关系

ORACLE中调用方法类似。

相关文章:

  • 2021-11-19
  • 2021-06-22
  • 2021-11-19
  • 2022-01-13
  • 2021-07-18
  • 2022-12-23
猜你喜欢
  • 2021-10-20
  • 2021-11-19
  • 2022-02-07
  • 2021-09-16
  • 2021-11-29
  • 2021-11-29
相关资源
相似解决方案