自我加入
表可以連線到自身,其中不同的行通過某種條件彼此匹配。在此用例中,必須使用別名以區分表的兩次出現。
在下面的示例中,對於示例資料庫 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 條件的記錄,因此別名 e
表 ManagerId
等於別名 m
表 Id
的任何記錄:
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.FName
和 m.FName
由其別名列名替換,並使用 AS 運算子分配 :
僱員 | 經理 |
---|---|
約翰 | 詹姆士 |
邁克爾 | 詹姆士 |
喬納森 | 約翰 |