LEFT JOIN 和 RIGHT JOIN 运算 (Microsoft Access SQL)
适用于:Access 2013、Office 2013
在任何 FROM 子句中用于组合源表记录。
语法
FROM table1 [ LEFT |RIGHT ] JOIN table2 ON table1.field1compopr table2.field2
LEFT JOIN 和 RIGHT JOIN 操作包含以下部分:
Part |
说明 |
---|---|
table1、table2 |
对其中的记录进行组合的表的名称。 |
field1、field2 |
被联接的字段的名称。 这些字段必须具有相同的数据类型,并且包含相同类型的数据,但它们不必同名。 |
compopr |
任何关系比较运算符:"="、"<"、">"、"<="、">="或 "<>"。 |
备注
通过 LEFT JOIN 操作可以创建一个左外部联接。 左外部联接包含两个表中第一个(左)表中的所有记录,即使在第二个(右)表中没有匹配的记录值。
通过 RIGHT JOIN 操作可以创建一个右外部联接。 右外部联接包含两个表中第二个(右)表中的所有记录,即使在第一个(左)表中没有匹配的记录值。
例如,可以将 LEFT JOIN 用于 Departments(左)和 Employees(右)表以选择所有部门,包括那些没有被分配雇员的部门。 若要选择所有雇员,包括那些没有被分配到任何部门的雇员,可以使用 RIGHT JOIN。
下面的示例展示了如何通过 CategoryID 字段联接 Categories 表和 Products 表。 该查询将产生一个所有分类的列表,其中包括不包含任何产品的分类:
SELECT CategoryName,
ProductName
FROM Categories LEFT JOIN Products
ON Categories.CategoryID = Products.CategoryID;
在以下示例中,CategoryID 是联接字段,但是它不包括在查询结果中,因为它没有包括在 SELECT 语句中。 若要包含联接字段,请在 SELECT 语句中输入该字段名,在本例中为 Categories.CategoryID。
注意
- 若要创建一个只包括在联接字段中具有相同数据的记录,请使用 INNER JOIN 操作。
- LEFT JOIN 或 RIGHT JOIN 可以嵌套到 INNER JOIN 语句中,但是 INNER JOIN 语句不能嵌套到 LEFT JOIN 或 RIGHT JOIN 语句中。 请参阅 INNER JOIN 主题中有关嵌套的讨论,以了解如何在其他联接中嵌套联接。
- 可以链接多个 ON 子句。 请参阅 INNER JOIN 主题中有关子句链接的讨论,以了解如何操作。
- 如果尝试联接包含 Memo 或 OLE 对象数据的字段,则会出错。
示例
本示例:
假设 Employees 表中存在假想的 Department Name 和 Department ID 字段。 请注意,这些字段实际上在 Northwind 数据库 Employees 表中不存在。
选择所有部门,包括那些没有员工的部门。
调用 EnumFields 过程,您可以在 SELECT 语句示例中找到该过程。
Sub LeftRightJoinX()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' Select all departments, including those
' without employees.
Set rst = dbs.OpenRecordset _
("SELECT [Department Name], " _
& "FirstName & Chr(32) & LastName AS Name " _
& "FROM Departments LEFT JOIN Employees " _
& "ON Departments.[Department ID] = " _
& "Employees.[Department ID] " _
& "ORDER BY [Department Name];")
' Populate the Recordset.
rst.MoveLast
' Call EnumFields to print the contents of the
' Recordset. Pass the Recordset object and desired
' field width.
EnumFields rst, 20
dbs.Close
End Sub