通常,您创建的连接只返回满足连接条件的行;这些连接称为内连接,它们是查询时使用的缺省连接。但是,您有时可能想保留一个表中的所有行。若要实现此目的,您可以使用外连接。
两个表的左或右外连接将保留一个表的所有行,并为另一个表中不满足连接条件的行提供空值。左外连接保留左侧表中的每一行,右外连接保留右侧表中的每一行。在完全外连接中,保留两个表的所有行。
左外连接或右外连接的左右两侧的表表达式称作保留的和提供空值的。在左外连接中,左侧表表达式是保留的,右侧表表达式是提供空值的。
有关使用 Transact-SQL 语法创建外连接的信息,请参见Transact-SQL 外连接(*= 或 =*)。
以下语句包括了所有客户。如果某个特定的客户没有下订单,则结果中对应于订单信息的每一列都包含 NULL 值。
SELECT Surname, OrderDate, City FROM Customers LEFT OUTER JOIN SalesOrders ON Customers.ID = SalesOrders.CustomerID WHERE Customers.State = 'NY' ORDER BY OrderDate; |
Surname | OrderDate | City |
---|---|---|
Thompson | (NULL) | Bancroft |
Reiser | 2000-01-22 | Rockwood |
Clarke | 2000-01-27 | Rockwood |
Mentary | 2000-01-30 | Rockland |
... | ... | ... |
此语句中的外连接可解释如下。请注意,这只是概念上的说明,并不表示 SQL Anywhere 实际就是这样计算结果集的。
为客户下的每一份销售订单返回一行。由于为每一个销售订单都返回一行,因此,如果客户下了两个或两个以上的销售订单,就会返回多行。此结果与内连接的结果相同。使用 ON 条件来匹配客户和销售订单行。在此步骤中不使用 WHERE 子句。
为没有下任何销售订单的每一位客户包含一行。这确保包括 Customers 表中的每一行。对于所有这些行,都用空值填充来自 SalesOrders 表的列。因为使用了关键字 OUTER,所以加上这些行,如果是内连接就不会有这些行。在此步骤中既不使用 ON 条件也不使用 WHERE 子句。
使用 WHERE 子句,排除客户不居住在纽约的每一行。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |