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

SQL函數(shù)——將一對(duì)多關(guān)系轉(zhuǎn)換成一對(duì)一關(guān)系

系統(tǒng) 1925 0

我們經(jīng)常會(huì)遇到想要把一對(duì)多關(guān)系轉(zhuǎn)換成為一對(duì)一關(guān)系,以方便顯示。例如有如下關(guān)系:
Class(ClassID,ClassName) Student(SID,SName,ClassID) ,并且,這兩個(gè)關(guān)系存在以下測(cè)試數(shù)據(jù):

Class:

001

語(yǔ)文

002

數(shù)學(xué)

Student

031231301

張三

001

031231301

張三

002

031231302

李四

001

那么,這兩個(gè)關(guān)系表達(dá)的意思:選語(yǔ)文的有張三和李四;選數(shù)學(xué)的有李四。如果想做一個(gè)視圖( V_STU_CLA )來表達(dá)這種一對(duì)多關(guān)系(一門課程,被多個(gè)學(xué)生所選擇),可以使用一個(gè)簡(jiǎn)單的左聯(lián)語(yǔ)句來完成:
得到的結(jié)果如下:

SELECT C.ClassID,C.ClassName,S.SName FROM ClassC
LEFT JOIN StudentS ON C.ClassID = S.ClassID;

ClassID

ClassName

SName

001

語(yǔ)文

張三

001

語(yǔ)文

李四

002

數(shù)學(xué)

張三

這樣雖然能夠清晰的表達(dá)選課關(guān)系,但是,某些情況下,它不如下面這種形式來得一目了然:

ClassID

ClassName

SNames

001

語(yǔ)文

張三 , 李四

002

數(shù)學(xué)

張三

要達(dá)到這樣的目的,需要完成一個(gè)一對(duì)多關(guān)系到一對(duì)一關(guān)系的轉(zhuǎn)換。這樣的轉(zhuǎn)換,在數(shù)據(jù)庫(kù)中,可以借助函數(shù)來進(jìn)行,因?yàn)楹瘮?shù)中應(yīng)用到了游標(biāo),故對(duì)于 Oracle MSSQL 稍有不同,附上兩個(gè)版本的函數(shù) SQL 代碼:

MS-SQL 版:

MS-SQL 調(diào)用時(shí),通過以下語(yǔ)句實(shí)現(xiàn):
ORACLE 中調(diào)用方法類似。

SELECT C.ClassID,C.ClassName,dbo.f_getStuNamesByClassID(C.ClassID)
FROM ClassC;
-- 根據(jù)課程ID,返回選此課程的學(xué)生的名字,以逗號(hào)隔開
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
;
-- 去除最后多余的一個(gè)逗號(hào)

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

-- 通過游標(biāo),查找并拼接此課程下的學(xué)生姓名
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;
-- 去掉最后一個(gè)逗號(hào)

Result: = SUBSTR(Result, 0 ,LENGTH(Result) - 1 );
return
(Result);
end
;

SQL函數(shù)——將一對(duì)多關(guān)系轉(zhuǎn)換成一對(duì)一關(guān)系


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产精品人成 | 综合热久久 | 国产精品一区二区欧美视频 | 欧美成人午夜免费完成 | 中文字幕一区二区三区永久 | 成人短视频在线观看 | 夜色福利一区二区三区 | 欧美特欧美特级一片 | 波多野结衣中文字幕一区 | 欧美综合成人网 | 九九精品视频免费 | 自拍 亚洲 欧美 | 天天干天天色天天射 | 青青青在线观看免费视频精品 | 91福利精品老师国产自产在线 | 亚洲欧美片 | 色综合一区二区三区 | 亚洲综合另类 | 日韩精品国产自在欧美 | xxx中国毛茸茸 | 在线看福利视频120秒 | 中文字幕不卡在线观看 | 一本大道加勒比久久综合 | 爱爱精品视频 | 开心久久婷婷综合中文字幕 | 欧美亚洲一区二区三区四 | 中文字幕亚洲综合久久 | 国产精品深夜福利免费观看 | 国产农村一一级特黄毛片 | 午夜a一级毛片一.成 | 成人欧美一级毛片免费观看 | 久久伊人影院 | 日本老熟妇激情毛片 | 国产一区二区三区久久 | 精品综合久久久久久99 | 久久综合五月 | 国产一区二区三区在线免费观看 | 国产99视频精品草莓免视看 | 日本不卡免费在线 | 亚洲无总热门 | 极品福利在线 |