假设您需要一个按时间顺序排列的订单和下达这些订单的公司的列表,但您希望列出的是公司名而不是它们的客户 ID,则您可以使用连接来获得此结果。
要列出 2001 年初以来每个订单的订单 ID、日期和公司名,请执行以下查询:
SELECT SalesOrders.ID, SalesOrders.OrderDate, Customers.CompanyName FROM SalesOrders KEY JOIN Customers WHERE OrderDate > '2001/01/01' ORDER BY OrderDate; |
以下语句使用子查询代替连接来得到相同的结果:
SELECT SalesOrders.ID, SalesOrders.OrderDate, ( SELECT CompanyName FROM Customers WHERE Customers.ID = SalesOrders.CustomerID ) FROM SalesOrders WHERE OrderDate > '2001/01/01' ORDER BY OrderDate; |
尽管 SalesOrders 表不是子查询的一部分,子查询也会引用 SalesOrders 表中的 CustomerID 列。而 SalesOrders.CustomerID 列在语句的主体部分引用 SalesOrders 表。
如果只需要另一个表中的一个列,就可以使用子查询代替连接。(回想一下,子查询只能返回一列。)在本例中,您只需要 CompanyName 列,因此可以将连接更改为子查询。
要列出华盛顿州的所有客户以及他们最近的订单 ID,请执行以下查询:
SELECT CompanyName, State, ( SELECT MAX( ID ) FROM SalesOrders WHERE SalesOrders.CustomerID = Customers.ID ) FROM Customers WHERE State = 'WA'; |
CompanyName | State | MAX(SalesOrders.ID) |
---|---|---|
Custom Designs | WA | 2547 |
It's a Hit! | WA | (NULL) |
It's a Hit! 公司没有下任何订单,因此子查询为此客户返回 NULL。使用内连接时,不会列出没有下订单的公司。
您还可以显式地指定一个外连接。在本例中,还需要 GROUP BY 子句。
SELECT CompanyName, State, MAX( SalesOrders.ID ) FROM Customers KEY LEFT OUTER JOIN SalesOrders WHERE State = 'WA' GROUP BY CompanyName, State; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |