Skip to main content

SQLite自连接-将表连接到自身

请注意,在继续学习本教程之前,您应该熟悉内部连接和左连接子句。

SQLite自连接简介

self-join是一种特殊的连接,它允许您使用LEFT-join或internal-join子句将表连接到自身。您可以使用自连接创建一个结果集,将这些行与同一表中的其他行连接起来。

因为在查询中不能多次引用同一个表,所以在使用自联接时,需要使用表别名为表指定不同的名称。

自联接比较同一表中相同或不同列的值。自联接只涉及一个表。

您经常使用自连接来查询存储在表中的父/子关系或获取运行总数。

SQLite自连接示例

我们将使用示例数据库中的employees表进行演示。

employees表不仅存储员工数据,还存储组织数据。ReportsTo列指定员工之间的报告关系。

如果员工向经理报告,则员工行的ReportsTo列的值等于经理行的EmployeeId列的值。如果员工未向任何人报告,则ReportsTo列为空。

要了解谁是谁的直接下属,请使用以下语句:

SELECT m.firstname || ' ' || m.lastname AS 'Manager',
e.firstname || ' ' || e.lastname AS 'Direct report'
FROM employees e
INNER JOIN employees m ON m.employeeid = e.reportsto
ORDER BY manager;

试试看

SQLite self join example

该语句使用内部连接子句将员工连接到自身。employees表有两个角色:雇员和经理。

因为我们使用了内部JOIN子句将employees表连接到其自身,所以结果集没有管理器列包含空值的行。

请注意,连接运算符| |将多个字符串连接为一个字符串。在本例中,我们使用连接运算符通过连接名字、空格和姓氏来从员工的全名中删除。

如果您想查询不向任何人报告的CEO,您需要在上面的查询中将内部JOIN子句更改为LEFT JOIN子句。

SQLite self join with left join example

安德鲁·亚当斯是首席执行官,因为他不报告任何人。

您可以使用自连接技术查找位于同一城市的员工,如下查询所示:

SELECT DISTINCT
e1.city,
e1.firstName || ' ' || e1.lastname AS fullname
FROM
employees e1
INNER JOIN employees e2 ON e2.city = e1.city
AND (e1.firstname <> e2.firstname AND e1.lastname <> e2.lastname)
ORDER BY
e1.city;

试试看

SQLite self join - employees locate in the same city

连接条件有两个表达式:

在本教程中,我们向您展示了如何使用SQLite自连接技术将表连接到自身。