免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

SQL分層查詢

數(shù)據(jù)中可能存在層次關(guān)系,本文章主要介紹查詢這種關(guān)系的實例 。會大量使用遞歸式 CTE 。
Emps 表中 EName 員工和 MGR 上級之間的關(guān)系如下:

SQL分層查詢

文章插圖
每個上級也同樣是員工,主管和員工之間為父子關(guān)系 。
1.呈現(xiàn)父子關(guān)系
情景:返回員工數(shù)據(jù)的同時返回上級信息(名字,角色,薪水) 。如下:
SQL分層查詢

文章插圖
解決方案:基于 MGR 和 EName 相等自連接,找出每個員工上級的數(shù)據(jù)即可解決 。
SELECT a.EName 員工名,a.MGR 上級,b.SAL 上級薪水,B.Role 上級角色 FROM test.emps aleft join test.emps b on a.MGR = b.EName也可以使用標量子查詢,注意標量子查詢只能返回一列 。
select a.EName 員工名, (select b.EName FROM test.emps b where b.EName = a.MGR) 上級,(select b.SAL FROM test.emps b where b.EName = a.MGR) 上級薪水,(select b.Role FROM test.emps b where b.EName = a.MGR) 上級角色 FROM test.emps a;2.呈現(xiàn)子-父-祖父關(guān)系
情景:員工A的上級是員工M,員工M的上級是員工B,員工B的上級是員工Z 。想要呈現(xiàn)出這種關(guān)系 。如下圖:
SQL分層查詢

文章插圖
解決方案:由于要呈現(xiàn)的關(guān)系包含多層關(guān)系,而且是動態(tài)的,所以可以使用CTE遞歸來實現(xiàn) 。
with RECURSIVE empss as(select EName,MGR,ENAme as Re fromtest.empsunion allselect a.EName as EName, b.MGR as MGR,CONCAT(a.Re , '->' , b.EName) as Re from empss aleft join emps b on a.MGR = b.ENamewhere a.MGR is not null ) select EName 員工,Re 關(guān)系 from empss where MGR is null 3.創(chuàng)建基于表的分層視圖
情景:返回一個結(jié)果集,將整張表的層次結(jié)構(gòu)呈現(xiàn)出來 。在 emps 表中,員工Z上沒有上級 。從員工Z 開始顯示所有下屬以及這些下屬所有的下屬 。如下:
SQL分層查詢

文章插圖
解決方案:該結(jié)果集相當于上一個情景反過來,區(qū)別在于從根開始 。同樣這里使用 CTE 遞歸 。先找到根,然后通過 EName 和 MGR 連接尋找下屬 。
with recursive empss as(SELECT EName as Re,EName FROM test.emps where MGR is nullunion allSELECT concat(b.Re,'-',a.EName) as Re,a.EName FROM test.emps ajoin empss b on a.MGR = b.EName)select Re 關(guān)系 from empss order by Re4.確定葉子節(jié)點、分支節(jié)點和根節(jié)點
情景:判斷給定的行是哪種類型:葉子節(jié)點、分支節(jié)點還是根節(jié)點 。在員工表中,葉子節(jié)點指的是不是任何員工上級的員工,分支節(jié)點指的是自己是上級且還是某個員工的下屬,根節(jié)點指的是沒有上級的員工 。如下:
SQL分層查詢

文章插圖
解決方案:使用標量子查詢在每行每個節(jié)點類型列中返回布爾值 。是否葉子節(jié)點,通過判斷上級是該員工的員工數(shù)量,如果是0就表示該員工是葉子節(jié)點 。是否分支節(jié)點,通過判斷該員工是否存在上級,并且上級是該員工的員工數(shù)量大于0,如果大于0表示該員工是分支節(jié)點,這里使用 sign() 函數(shù)返回標志 。是否根節(jié)點,只需要判斷該員工是否沒有上級即可 。
SELECT EName,(selectcount(*)=0 fromtest.emps b where a.EName = b.MGR ) as 是否葉子節(jié)點,(select sign(count(*)) fromtest.emps b where a.EName = b.MGRand a.MGR is not null) as 是否分支節(jié)點,a.MGR is null as 是否根節(jié)點 FROM test.emps a;【SQL分層查詢】

    經(jīng)驗總結(jié)擴展閱讀