SQL自联接

示例

一个表可以连接到自身,而不同的行在某种条件下彼此匹配。在这种情况下,必须使用别名以区分表的两次出现。

在下面的示例中,对于示例数据库“雇员”表中的每个“雇员”,将返回一条记录,其中包含该雇员的名字以及该雇员的经理的相应名字。由于经理也是员工,因此该表将自身结合在一起:

SELECT 
   e.FNameAS "Employee", 
   m.FNameAS "Manager"
FROM   
    Employees e
JOIN   
    Employees m 
    ONe.ManagerId= m.Id

该查询将返回以下数据:

雇员经理
约翰詹姆士
麦可詹姆士
约翰松约翰

那么这是如何工作的呢?

原始表包含以下记录:

ID姓名名称号码ManagerId部门编号薪水雇用日期
1詹姆士史密斯1234567890空值110002002年1月1日
2约翰约翰逊2468101214114002005年3月23日
3麦可威廉姆斯1357911131126002009年12月5日
4约翰松史密斯1212121212215002016年7月24日

第一步是为FROM子句中使用的表中的所有记录创建笛卡尔乘积。在这种情况下,它是雇员表两次,因此中间表将如下所示(我删除了此示例中未使用的任何字段):

编号e.FNamee.ManagerIdm.ManagerId
1詹姆士空值1詹姆士空值
1詹姆士空值2约翰1
1詹姆士空值3麦可1
1詹姆士空值4约翰松2
2约翰11詹姆士空值
2约翰12约翰1
2约翰13麦可1
2约翰14约翰松2
3麦可11詹姆士空值
3麦可12约翰1
3麦可13麦可1
3麦可14约翰松2
4约翰松21詹姆士空值
4约翰松22约翰1
4约翰松23麦可1
4约翰松24约翰松2

下一步是仅保留满足JOIN条件的记录,因此任何别e名表ManagerId等于别m名表的记录Id:

编号e.FNamee.ManagerIdm.ManagerId
2约翰11詹姆士空值
3麦可11詹姆士空值
4约翰松22约翰1

然后,对SELECT子句中使用的每个表达式求值以返回该表:

e.FName
约翰詹姆士
麦可詹姆士
约翰松约翰

最后,用AS运算符分配的列名e.FName和m.FName被其别名列名替换:

雇员经理
约翰詹姆士
麦可詹姆士
约翰松约翰