亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

SQL函數——將一對多關系轉換成一對一關系

系統 1714 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條評論
主站蜘蛛池模板: 神马影院午夜我不卡 | 国内精品伊人久久久久7777人 | 国产精品v一区二区三区 | 国产亚洲欧美日韩综合综合二区 | 亚洲综合精品一区二区三区中文 | 国产精品高清一区二区不卡 | 91精品国产免费久久国语麻豆 | 中文字幕在线精品 | 伊人久久精品成人网 | 四虎最新紧急入口 | 老司机永久免费视频 | 亚洲欧美日韩中文v在线 | 老司机永久免费视频 | 色播影音 | 99热这里只有精品一区二 | 欧美一级片免费 | 四虎四虎1515whh | 免费福利入口在线观看 | 黄色一级片a | 欧美性猛交xxxxxxxx软件 | 精品久久久久久18免费看 | 成年男女免费视频观看性 | 精品日产一区二区三区手机 | 国产日韩精品视频 | 青青青国产 | 黄色网址视频在线播放 | 成人在线不卡 | 精品日本久久久久久久久久 | 久久高清免费视频 | 亚洲成人在线视频播放 | 国产呦精品系列在线 | 日韩做爰视频免费 | 亚洲欧美在线精品一区二区 | 草莓视频一区二区精品 | 亚洲香蕉久久一区二区三区四区 | 99re6这里有精品热视频在线 | 久久综合九色综合欧洲 | 高清午夜毛片 | 免费网站日本永久免费观看 | 深夜男人影院 | 四虎在线观看免费视频 |