Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » 使用子查询

 

使用子查询代替连接

假设您需要一个按时间顺序排列的订单和下达这些订单的公司的列表,但您希望列出的是公司名而不是它们的客户 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;