1. 程式人生 > 實用技巧 >一個錯誤例子帶你深入理解資料庫“自聯接”查詢

一個錯誤例子帶你深入理解資料庫“自聯接”查詢

情景:

員工表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 b

on 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

二. 使用不同列進行自聯接

詳見開頭