使用自我聯結
到目前為止,我們所使用的聯結都涉及不同的資料表。 在某些情況下,您可能需要取出來自某個資料表的資料列,並將其與來自相同資料表中的其他資料列比較。 例如,在人力資源應用中,Employee 資料表可能會包含每個員工之主管的相關資訊,並將主管的識別碼儲存在員工自己的資料列中。 每個主管也都會列為員工。
EmployeeID
FirstName
ManagerID
1
Dan
NULL
2
Aisha
1
3
Rosie
1
4
Naomi
3
若要取出員工資訊並將其配對至相關聯的主管,基於查詢的目的,您可以在查詢中使用該資料表兩次,並將其與其自己聯結。
SELECT emp.FirstName AS Employee,
mgr.FirstName AS Manager
FROM HR.Employee AS emp
LEFT OUTER JOIN HR.Employee AS mgr
ON emp.ManagerID = mgr.EmployeeID;
此查詢的結果會包含具有每個員工及其主管名稱的資料列。 公司的執行長並沒有任何主管。 若要在結果中包含執行長,應該使用外部聯結,且系統會針對 ManagerID 欄位沒有相符 EmployeeID 欄位的資料列傳回 NULL 作為主管名稱。
員工
管理員
Dan
NULL
Aisha
Dan
Rosie
Dan
Naomi
Rosie
在其他情況下,您會需要將某一個資料表中的資料列,與相同資料表中的不同資料列比較。 如您所見,使用 T-SQL 來比較相同資料列中的資料行是件很簡單的工作,但若要比較來自不同資料列 (例如一個儲存開始時間的資料列,以及另一個位於相同資料表並儲存相對應停止時間的資料列) 的值,其方法便較為不明確。 自我聯結是很適合用於這些查詢類型的技巧。
若要完成這類工作,您應該考慮下列指導方針:
- 在 FROM 子句中定義相同資料表的兩個執行個體,並視需要使用內部或外部聯結加以聯結。
- 使用資料表別名來區分相同資料表的兩個執行個體。
- 使用 ON 子句來提供篩選,以比較資料表其中一個執行個體的資料行,以及資料表另一個執行個體的資料行。