自我加入

表可以連線到自身,其中不同的行通過某種條件彼此匹配。在此用例中,必須使用別名以區分表的兩次出現。

在下面的示例中,對於示例資料庫 Employees 表中的每個 Employee,將返回一條記錄,其中包含員工的名字以及員工經理的相應名字。由於經理也是員工,因此表格與自身相結合:

SELECT 
    e.FName AS "Employee", 
    m.FName AS "Manager"
FROM   
    Employees e
JOIN   
    Employees m 
    ON e.ManagerId = m.Id

此查詢將返回以下資料:

僱員 經理
約翰 詹姆士
邁克爾 詹姆士
喬納森 約翰

那怎麼辦?

原始表包含以下記錄:

ID FName 引數 LName 電話號碼 經理 ID DepartmentID 薪水 聘用日期
1 詹姆士 工匠 1234567890 空值 1 1000 2002 年 1 月 1 日
2 約翰 約翰遜 2468101214 1 1 400 23-03-2005
3 邁克爾 威廉姆斯 1357911131 1 2 600 12-05-2009
4 喬納森 工匠 1212121212 2 1 500 24-07-2016

第一個操作是建立 FROM 子句中使用的表中所有記錄的笛卡爾積。在這種情況下,它是兩次 Employees 表,因此中間表將如下所示(我刪除了此示例中未使用的任何欄位): ****

e.Id e.FName e.ManagerId m.FName m.ManagerId
1 詹姆士 空值 1 詹姆士 空值
1 詹姆士 空值 2 約翰 1
1 詹姆士 空值 3 邁克爾 1
1 詹姆士 空值 4 喬納森 2
2 約翰 1 1 詹姆士 空值
2 約翰 1 2 約翰 1
2 約翰 1 3 邁克爾 1
2 約翰 1 4 喬納森 2
3 邁克爾 1 1 詹姆士 空值
3 邁克爾 1 2 約翰 1
3 邁克爾 1 3 邁克爾 1
3 邁克爾 1 4 喬納森 2
4 喬納森 2 1 詹姆士 空值
4 喬納森 2 2 約翰 1
4 喬納森 2 3 邁克爾 1
4 喬納森 2 4 喬納森 2

下一步操作是僅保留符合 JOIN 條件的記錄,因此別名 eManagerId 等於別名 mId 的任何記錄:

e.Id e.FName e.ManagerId m.FName m.ManagerId
2 約翰 1 1 詹姆士 空值
3 邁克爾 1 1 詹姆士 空值
4 喬納森 2 2 約翰 1

然後,評估 SELECT 子句中使用的每個表示式以返回此表:

e.FName m.FName
約翰 詹姆士
邁克爾 詹姆士
喬納森 約翰

最後,列名稱 e.FNamem.FName 由其別名列名替換,並使用 AS 運算子分配 :

僱員 經理
約翰 詹姆士
邁克爾 詹姆士
喬納森 約翰