一個錯誤例子帶你深入理解資料庫“自聯接”查詢
阿新 • • 發佈:2020-10-19
情景:
員工表emp,表內包含①員工編號empno②員工姓名ename③員工的上級領導編號mgr
sql語句如下:
select empno,ename,mgr from emp
select a.empno,a.ename,b.ename as 領導
from emp a
join emp b
on a.mgr = b.empno;
到這裡,有自聯接基礎的小夥伴應該不難理解我是在做:查詢員工的上級領導。
那麼,錯誤例子到底在哪呢?
思考,如果以上語句中的on a.mgr = b.empno的部分,把on聯接條件換成a.empno= b.mgr,那麼查詢結果會截然不同!大錯特錯。
以下,為錯誤示例圖:
不難發現,員工姓名和領導的資訊對調。
那麼,問題來了:我們只是在操作一張表,只是對錶設定兩個不同的別名,為什麼交換empno和mgr的順序會出現錯誤?這在筆試中在我們無法上機驗證我們寫的到底是否是有效的sql語句的情況下,該如何解決。錯誤到底出現到了哪裡?留給大家思考。(望評論)
自聯接
查詢範圍在一張表中,對一張表設定兩個不同的表別名a,b。能實現查詢一列中重名的學生,查詢多列中員工與領導的所屬關係。
一. 使用同一列進行自聯接
栗子:查詢重名學生
已知:學生表student,表內資訊①學生姓名sname②學生編號sid
select a.,b.
from student a join student bon a.sname=b.sname
到這裡,查詢結果集是原表的資料+重名學生的資料,切勿忘記用where進行條件篩選,完整最終查詢重名學生sql語句如下:
select a.,b.
from student a join student b
on a.sname=b.sname
where a.sid<>b.sid
二. 使用不同列進行自聯接
詳見開頭