FROM 子句中的子查询

本节描述作为嵌套在外部 SELECT 语句的 FROM 子句中发生的子查询。由于外部查询使用子查询的结果作为数据源,因而此类子查询有时候称为派生表表表达式

下列查询在外部查询中使用星号表示法来返回检索 employee 表中 address 列所有字段的子查询的结果。

图: 查询

SELECT * FROM (SELECT address.* FROM employee);

图: 查询结果

address   ROW(102 Ruby, Belmont, CA, 49932, 1000)
          address   ROW(133 First, San Jose, CA, 85744, 4900)
          address   ROW(152 Topaz, Willits, CA, 69445, 1000))
          ⋮

这说明了如何指定派生表,但是它只是该语法的一个价值不高的示例,因为外部查询不操作 FROM 子句中的子查询返回的表表达式中的任何值。(请参阅图 1获取返回相同结果的简单查询。)

下列查询是一个更复杂的示例,其中外部查询仅选择派生表中满足条件的第一行,FROM 子句中的子查询将此派生表中满足条件的第一行,FROM 子句中的子查询将此派生表指定为 customercust_calls 表的简单连接。

图: 查询

SELECT LIMIT 1 * FROM 
          (SELECT c.customer_num, c.lname, c.company, 
          c.phone, u.call_dtime, u.call_descr
          FROM customer c, cust_calls u
          WHERE c.customer_num = u.customer_num
          ORDER BY u.call_dtime DESC);
该查询只返回客户已致电客户服务中心的那些行,如下所示。

图: 查询结果

customer_num  106
          lname         Watson
          company       Watson & Son
          phone         415-389-8789
          call_dtime    1998-06-12 08:20
          call_descr    Order was received, but two of the cans of 
          ANZ tennis balls within the case were empty

在前面的示例中,子查询包括 ORDER BY 子句,它指定出现在子查询的 Projection 列表中的一列,但如果 Projection 列表省略了 u.call_dtime 列,查询还是有效的。子查询仅可在 FROM 子句这个上下文中指定 ORDER BY 子句。