SQL Server 的右外连接返回右表中的所有记录,并匹配左表中的行。右连接也可以称为右外连接。因此,使用 Outer 关键字是可选的。请记住,左表中所有不匹配的行将用 NULL 值填充。其语法如下:
SELECT Table1.Column(s), Table2.Column(s),
FROM Table1
RIGHT 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
RIGHT JOIN
Table2 ON
Table1.Common_Column = Table2.Common_Column
为了更好地理解,让我们看看 SQL Server 右连接的视觉表示。从上图可以看出,它显示了 Table2 中的所有记录以及 Table1 中的匹配记录。

对于这个右外连接示例,我们将使用数据库中的两个表。Employee 中的数据是

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

SQL 右连接选择所有列
以下右连接查询将显示 Department 表中的所有列以及 Employees 表中的匹配记录。
SELECT *
FROM [Employee]
RIGHT OUTER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

不带 Outer 关键字
正如我们之前所说,使用 Outer 关键字是可选的。所以,我将删除 Outer 关键字,并使用 SQL Server RIGHT JOIN 进行工作。
SELECT *
FROM [Employee]
RIGHT OUTER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

尽管 Employee 表有 15 条记录,但右连接显示了 13 条记录。这是因为
- Employee 表中第 14 条和第 15 条记录的 Department ID 为 NULL,因此在右表中没有匹配的记录。
- 如果您观察到第 8 条和第 9 条记录,它们显示了 NULL 值。因为在 Employee 表中,Department 表中的 Department ID 3 和 4(Module Lead 和 Team Lead)没有匹配的记录。因此它们被 NULL 替换了。
注意:[Department ID] 列重复出现两次,这会惹恼用户。通过选择单独的列名,我们可以避免不必要的列。因此,请避免使用 SELECT * 语句。
SQL 右外连接选择几列
请在 SELECT 语句 之后放置所需的列,以避免在 连接 中出现不必要的列。
SELECT [FirstName]
,[LastName]
,[DepartmentName]
FROM [Employee]
RIGHT JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]

上面的右连接查询可以完美工作,只要 Employee 和 Department 表中的列名不同。如果它们具有相同的列名,您将收到错误。让我们看看如何解决这个问题。
在这里,我们使用了上面的右外连接查询。但是,我们添加了来自 department 表的 id 作为附加列。
SELECT [FirstName]
,[LastName]
,id
,[DepartmentName]
FROM [Employee]
RIGHT OUTER JOIN
[Department] ON
[Employee].[DepartID] = [Department].[id]
正如您所见,右连接引发了一个错误:Ambiguous column name id。这是因为 id 列同时存在于 Employee 和 department 表中。并且它无法识别您正在声明哪个列。

为了解决这类问题,请在列名前使用表名。例如,下面的右外连接查询在列名前使用了 别名 表名。
通过这种方法,我们可以通知服务器我们正在查找属于 department 表的 id 列。
我们可以将之前的右外连接查询重写为
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.id
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
RIGHT JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]

SQL Server 右连接 WHERE 子句
它还允许我们使用 WHERE 子句 来限制返回的记录。在此示例中,我们将 WHERE 子句与右外连接一起使用。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
RIGHT JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]
WHERE Emp.[FirstName] IS NOT NULL

右连接 ORDER BY 子句
它允许我们使用 Order By 子句来重新排列记录的顺序。
SELECT Emp.[FirstName] AS [First Name]
,Emp.[LastName] AS [Last Name]
,Dept.[DepartmentName] AS [Department Name]
FROM [Employee] AS Emp
RIGHT JOIN
[Department] AS Dept ON
Emp.[DepartID] = Dept.[id]
ORDER BY [FirstName] ASC
