SQL2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

INNER JOIN 运算

组合两个表中的记录,只要在公共字段之中有相符的值。

语法

FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2

INNER JOIN 运算可分为以下几个部分:

部分说明
table1, table2记录被组合的表的名称。
field1, field2被联接的字段的名称。若它们不是由数字构成的,则这些字段必须为相同的数据类型并包含同类数据,但它们无须具有相同的名称。
compopr任何的关系比较运算子:"=," "<," ">," "<=," ">=," 或 "<>."

说明

可以在 FROM 子句中使用INNER JOIN运算。.这是最普通的联接类型。只要在这两个表的公共字段之中有相符值,内部联接将组合两个表中的记录。

可以使用 INNER JOIN 与部门表及员工表选择每一个部门中的全部员工。反之,可以使用 LEFT JOIN RIGHT JOIN运算创建 outer join,从而选择所有部门(即使有些并没有员工)或所有员工(即使有些尚未分配到部门)。

若试图联接包含 MemoOLE Object数据的字段,会导致错误。

可以联接任何两个相同类型的数值字段。例如,可以联接 AutoNumberLong字段,因为它们类型相似。但不能联接 SingleDouble 类型的字段。

下列示例显示如何在类标识符字段联接类表及产品表:

SELECT CategoryName, ProductName

FROM Categories INNER JOIN Products

ON Categories.CategoryID = Products.CategoryID;

 

在上面的示例中,类标识符是已被联接的字段,但是它并不包含在查询输出中,因它并非被包含在 SELECT 语句之中。在这个示例中,若要包含联接字段,将字段名包含在 SELECT 语句中, Categories.CategoryID.

也可以使用下列语法,在一个 JOIN 语句中链接多个 ON 子句:

SELECT fields
FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field1 AND
ON table1.field2 compopr table2.field2) OR
ON table1.field3 compopr table2.field3)];

也可以使用下列语法,嵌套 JOIN 语句:

SELECT fields
FROM table1 INNER JOIN
(table2 INNER JOIN [( ]table3
[INNER JOIN [( ]tablex [INNER JOIN ...)]
ON table3.field3 compopr tablex.fieldx)]
ON table2.field2 compopr table3.field3)
ON table1.field1 compopr table2.field2;

在一个 INNER JOIN 之中,可以嵌套 LEFT JOIN 或 RIGHT JOIN,但是在 LEFT JOIN 或 RIGHT JOIN 中不能嵌套 INNER JOIN。

请参阅

FROM 子句 (Microsoft Jet SQL)TRANSFORM 语句 (Microsoft Jet SQL)
LEFT JOIN, RIGHT JOIN 运算 (Microsoft Jet SQL)UNION 运算 (Microsoft Jet SQL)
SELECT 语句 (Microsoft Jet SQL) 

示例

INNER JOIN 运算示例

INNER JOIN 运算示例

此示例创建了两个对等联接:一个是在订货明细表和订单表之间,另一个是在订单表和员工表之间。这是必需的,因为员工表不含业务人员数据,并且订货明细表不含员工数据。查询生成员工和他们的业绩列表。

此示例调用过程 EnumFields 过程,且可以在 SELECT 语句示例中找到该过程。

Sub InnerJoinX()

 

    Dim dbs As Database, rst As Recordset

 

    ' 在您的计算机中修改此行使其正确指到 Northwind 的路径。

    Set dbs = OpenDatabase("Northwind.mdb")

    ' 对运费超过 $100 的订单,

    

    ' 在订单明细和订单表之间创建联接

    '

    ' 并且在订单和员工表之间创建联接。列出员工和他们的业绩

    '

    Set rst = dbs.OpenRecordset("SELECT DISTINCTROW " _

        & "Sum(UnitPrice * Quantity) AS Sales, " _

        & "(FirstName & Chr(32) & LastName) AS Name " _

        & "FROM Employees INNER JOIN(Orders " _

        & "INNER JOIN [Order Details] " _

        & "ON [Order Details].OrderID = " _

        & "Orders.OrderID ) " _

        & "ON Orders.EmployeeID = " _

        & "Employees.EmployeeID " _

        & "GROUP BY (FirstName & Chr(32) & LastName);")

    

    ' populateRecordset。

    rst.MoveLast

    

    ' 调用 EnumFields 来打印记录集的内容。

    '传递记录集对象和要求的字符宽度。

    '

    EnumFields rst, 20

 

    dbs.Close

 

End Sub

 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

LEFT JOIN 和 RIGHT JOIN 运算

用于 FROM 子句时,把源表记录组合起来。

语法

FROM1 [ LEFT | RIGHT ] JOIN2
    ON 1.字段1 compopr 2. 字段2

LEFT JOIN 及 RIGHT JOIN 运算可分为以下几个部分:

部分说明
table1, table2记录被组合的表的名称。
field1, field2被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr任何的关系比较运算子:"=," "<," ">," "<=," ">=," 或 "<>."

说明

用 LEFT JOIN 运算 创建左边外部联接.左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

用RIGHT JOIN 运算 创建 右边外部联接.右边外部联接将包含了从第二个(右边)开始的两个表中的全部记录,即使在第一个(左边)表中并没有匹配值的记录。

例如,可以使用 LEFT JOIN 与部门(左边)及员工(右边)表来选择所有的部门,包含了没有分配到员工的部门。可以使用 RIGHT JOIN 选择所有的员工,包含了没有分配到部门的员工。

下列示例显示如何在类标识符字段中联接类表及产品表。查询将会列出所有种类的列表,包含那些没有产品在其中的种类:

SELECT CategoryName,

ProductName

FROM Categories LEFT JOIN Products

ON Categories.CategoryID = Products.CategoryID;

 

在本例中,CategoryID 是联接的字段,但由于它不包含在 SELECT 语句中,因此,也不包含在查询结果中。要包含联接的字段,请在 SELECT 语句中输入字段名 — 在这个示例中为 Categories.CategoryID。


注意

欲创建只包含联接字段中数据相同的记录的查询,请用 INNER JOIN 运算。

  • 在 INNER JOIN 之中可以写一个嵌套的 LEFT JOIN 或一个 RIGHT JOIN,但是在一个 LEFT JOIN 或一个 RIGHT JOIN 之中不能写嵌套的 INNER JOIN。请参阅 INNER JOIN 主题中有关使用嵌套的讨论,从其中可获知如何在其它联接中编写嵌套联接的信息。
  • 可以链接多个 ON 子句。若需更多信息,请参阅在 INNER JOIN 主题中的子句链接的讨论。

若试图联接包含 MemoOLE Object数据的字段,会导致错误。


请参阅
FROM 子句 (Microsoft Jet SQL)UNION 运算 (Microsoft Jet SQL)
INNER JOIN 运算 (Microsoft Jet SQL) 

示例

LEFT JOIN 和 RIGHT JOIN 运算示例


INNER JOIN 运算示例

LEFT JOINRIGHT JOIN 运算示例

此示例假设在员工表中存在假设的单位名称和单位标识符的字段。注意这些字段实际上在 Northwind 数据库员工表中并不存在。

此示例选择所有单位,包含那些不含员工的单位。

此示例调用过程 EnumFields 过程,且可以在 SELECT 语句示例中找到该过程。

Sub LeftRightJoinX()

 

    Dim dbs As Database, rst As Recordset

 

    ' 在您的计算机中修改此行使其正确指到 Northwind 的路径。

    Set dbs = OpenDatabase("Northwind.mdb")

    ' 对运费超过 $100 的订单,

    

    ' 选取所有单位,包括

    ' 没有员工的

    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];")

    

    ' populateRecordset。

    rst.MoveLast

    

    ' 调用 EnumFields 来打印记录集的内容。

    '传递记录集对象和要求的字符宽度。

    '

    EnumFields rst, 20

 

    dbs.Close

 

End Sub

 


此示例创建了两个对等联接:一个是在订货明细表和订单表之间,另一个是在订单表和员工表之间。这是必需的,因为员工表不含业务人员数据,并且订货明细表不含员工数据。查询生成员工和他们的业绩列表。

此示例调用过程 EnumFields 过程,且可以在 SELECT 语句示例中找到该过程。

Sub InnerJoinX()

 

    Dim dbs As Database, rst As Recordset

 

    ' 在您的计算机中修改此行使其正确指到 Northwind 的路径。

    Set dbs = OpenDatabase("Northwind.mdb")

    ' 对运费超过 $100 的订单,

    

    ' 在订单明细和订单表之间创建联接

    '

    ' 并且在订单和员工表之间创建联接。列出员工和他们的业绩

    '

    Set rst = dbs.OpenRecordset("SELECT DISTINCTROW " _

        & "Sum(UnitPrice * Quantity) AS Sales, " _

        & "(FirstName & Chr(32) & LastName) AS Name " _

        & "FROM Employees INNER JOIN(Orders " _

        & "INNER JOIN [Order Details] " _

        & "ON [Order Details].OrderID = " _

        & "Orders.OrderID ) " _

        & "ON Orders.EmployeeID = " _

        & "Employees.EmployeeID " _

        & "GROUP BY (FirstName & Chr(32) & LastName);")

    

    ' populateRecordset。

    rst.MoveLast

    

    ' 调用 EnumFields 来打印记录集的内容。

    '传递记录集对象和要求的字符宽度。

    '

    EnumFields rst, 20

 

    dbs.Close

 

End Sub

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值