SQL FULL JOIN(全连接)

SQL Server 全连接类型返回左表和右表中存在的所有记录(或行)。所有不匹配的行将填充 NULL 值。

SQL Server 全连接也可以称为全外连接。因此,使用 Outer 关键字是可选的。为了更好地理解,让我们看看它的可视化表示。从下图中,您可以轻松理解全连接显示表 1 和表 2 中存在的所有记录。全连接的语法如下所示:

SELECT Table1.Column(s), Table2.Column(s),
FROM Table1
 FULL OUTER JOIN
     Table2 ON
   Table1.Common_Column = Table2.Common_Column

--OR We can Simply Write it as
SELECT Table1. Column(s), Table2. Column(s),
FROM Table1
 FULL JOIN
     Table2 ON
   Table1.Common_Column = Table2.Common_Column

为了演示全连接,我们将使用数据库中存在的两个表(Employee 和 Department)。Employee 表中存在的数据是:

Full Join Diagramming representation

SQL Server Department 表中存在的数据是:

SQL 全外连接选择所有列

以下选择所有列的查询将显示 Employees 和 Department 中的所有列和行。

SELECT *
FROM [Employee]
 FULL OUTER JOIN
     [Department] ON
 [Employee].[DepartID] = [Department].[id]
SQL FULL JOIN 3
  • 如果您观察上面的截图,尽管 Employee 表中有 15 条记录,但全外连接合并并显示了 17 条记录,因为 Department 表中有两条记录,即部门 ID 3, 4(Module Lead 和 Team Lead),15 + 2 = 17 条总记录。
  • Employees 表中没有与部门 ID 3 和 4(Module Lead 和 Team Lead)匹配的记录,因此它们被 NULL 值替换。
  • [DepartID]、id、[Department Name] 的 ID 号 10、11、14 和 15 显示 NULL 值。因为它们在 Employee 表中的部门 ID 为 NULL,所以在右表中没有匹配的记录。

不带 Outer 关键字的全连接

如前所述,在此连接类型中使用 Outer 关键字是可选的。让我删除 Outer 关键字,然后使用 FULL JOIN。

SELECT *
FROM [Employee]
 FULL JOIN
     [Department] ON
 [Employee].[DepartID] = [Department].[id]
without Outer keyword 7

注意:[Department ID] 列重复两次,这会让用户感到困扰。通过选择单独的列名,我们可以避免不需要的列,因此请避免使用 SELECT * 语句。

SQL 全连接选择部分列

请将所需的字段放在 SELECT 语句之后,以避免不需要的列。

SELECT [FirstName]
      ,[LastName]
      ,[DepartmentName]
FROM [Employee]
  FULL JOINSelect Few Columns
     [Department] ON
  [Employee].[DepartID] = [Department].[id]

只要两个表(Employee 和 Department)中的列名不同,上述查询就能完美运行。

如果两个表中有相同的列名会发生什么?那么,您将陷入混乱。让我们看看如何解决这个问题。在进入解决方案之前,让我向您展示一个实际例子。

如您所见,我们正在使用上面的 SQL 全连接查询。但是,我们添加了 Department 表中的 id 作为附加列。

SELECT [FirstName]
      ,[LastName]
      ,id
      ,[DepartmentName]
FROM [Employee]
FULL OUTER JOIN
     [Department] ON
           [Employee].[DepartID] = [Department].[id]

如您所见,连接表会引发错误:列名 id 模糊。这是因为 id 在 Employee 和 Department 表中都存在。SQL Server 不知道您希望它检索哪一个。

Ambiguous column name id Error 8

为了解决这个问题,您始终必须在列名前使用表名。例如,以下代码在列名前使用别名表名。通过这种方法,我们可以告知服务器我们正在寻找属于 Department 表的 id。

我们可以将上述查询写为:

SELECT Emp.[FirstName] AS [First Name]
      ,Emp.[LastName] AS [Last Name]
	  ,Dept.id 
      ,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
FULL JOIN
     [Department] AS Dept ON
          Emp.[DepartID] = Dept.[id]
Solve Ambiguous column name id Error using Full Outer Join Alias 9

Where 子句中的 SQL Server 全外连接

它还允许我们使用 Where 子句来限制此查询返回的行数。因此,在此示例中,我们将使用 WHERE 子句和全连接。

SELECT Emp.[FirstName] AS [First Name]
      ,Emp.[LastName] AS [Last Name]
      ,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
  FULL OUTER JOIN
     [Department] AS Dept ON
    Emp.[DepartID] = Dept.[id]
WHERE Dept.[DepartmentName] IS NOT NULL
FULL JOIN in Where Clause 10

全外连接 Order By 子句

它允许我们使用 Order By 子句重新排列记录的顺序。

SELECT Emp.[FirstName] AS [First Name]
      ,Emp.[LastName] AS [Last Name]
      ,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
  FULL OUTER JOIN
     [Department] AS Dept ON
    Emp.[DepartID] = Dept.[id]
ORDER BY [DepartmentName] ASC
FULL JOIN Order By Clause 6