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

说明

table1table2

对其中的记录进行组合的表的名称。

field1field2

被联接的字段的名称。 这些字段必须具有相同的数据类型,并且包含相同类型的数据,但它们不必同名。

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