使用自我聯結

已完成

到目前為止,我們所使用的聯結都涉及不同的資料表。 在某些情況下,您可能需要取出來自某個資料表的資料列,並將其與來自相同資料表中的其他資料列比較。 例如,在人力資源應用中,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 子句來提供篩選,以比較資料表其中一個執行個體的資料行,以及資料表另一個執行個體的資料行。