使用外连接时通常会出现连接条件放置错误。在大多数情况下,如果您在 WHERE 子句中对提供空值的表施加限制,则连接等效于内连接。
原因在于:在搜索条件的任何输入都为 NULL 时,大多数搜索条件无法计算为 TRUE(真)。对提供空值的表的 WHERE 子句限制将限制值与 NULL 进行比较,导致从结果集中删除相应的行。保留的表中的行不再保留,因此连接是内连接。
例外的是有些比较在输入都为 NULL 时的值为真。这些包括 IS NULL、IS UNKNOWN、IS FALSE、IS NOT TRUE 和涉及 ISNULL 或 COALESCE 的表达式。
例如,以下语句计算左外连接。
SELECT * FROM Customers KEY LEFT OUTER JOIN SalesOrders ON SalesOrders.OrderDate < '2000-01-03'; |
相比之下,以下语句创建内连接。
SELECT Surname, OrderDate FROM Customers KEY LEFT OUTER JOIN SalesOrders WHERE SalesOrders.OrderDate < '2000-01-03'; |
这两个语句中的第一个语句可按如下说明来理解:首先,将 Customers 表左外连接到 SalesOrders 表。结果集中包括 Customers 表的所有行。对于在 2000 年 1 月 3 日之前没有任何订单的那些客户,用空值填充销售订单字段。
在第二条语句中,首先左外连接 Customers 和 SalesOrders。结果集中包括 Customers 表的所有行。对于没有任何订单的那些客户,用空值填充销售订单字段。接下来,通过只选择在其中客户自 2000 年 1 月 3 日以后已下了订单的那些行,应用 WHERE 条件。对于没有下任何订单的那些客户,这些值是空值。将任何值与空值进行比较将计算为 UNKNOWN(未知)。因此,这些行被删除,该语句简化为内连接。
有关搜索条件的详细信息,请参见搜索条件。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |