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 的用法 » 查询和修改数据 » 使用子查询

 

相关和不相关子查询

子查询可包含对父语句中所定义对象的引用。这称为外部引用。包含外部引用的子查询称为相关子查询。相关子查询无法独立于外部查询进行计算,因为子查询使用了父语句的值。即,会针对父语句中的每一行来执行子查询。因此,子查询的结果取决于父语句中正在计算的活动行。

例如,以下语句中的子查询返回的值取决于 Products 表中的活动行。

SELECT Name, Description
FROM Products
WHERE Quantity < 2 * (
   SELECT AVG( Quantity )
   FROM SalesOrderItems
   WHERE Products.ID=SalesOrderItems.ProductID );

在此示例中,该子查询中的 Products.ID 列就是外部引用。该查询会提取库存量少于某产品平均订购量两倍的产品的名称和说明(具体地讲,是指由主查询中 WHERE 子句测试的产品)。该子查询通过扫描 SalesOrderItems 表来实现此目的。但子查询 WHERE 子句中的 Products.ID 列引用的是 查询(而非子查询)的 FROM 子句所指定表中的列。在数据库服务器遍历 Products 表每一行的过程中,它会在对子查询的 WHERE 子句进行计算时使用当前行的 ID 值。

如果子查询中引用的列不存在于由子查询的 FROM 子句引用的表中,但存在于由外部查询的 FROM 子句引用的表中,则执行查询时不会出现错误。SQL Anywhere 通过外部查询中的表名隐式限定子查询中的列。

不包含对父语句中对象的引用的子查询称为不相关子查询。在以下示例中,子查询仅计算一个值:SalesOrderItems 表中的平均数量。在计算该查询时,数据库服务器会计算一次该值,然后将 Products 表 Quantity 字段中的每个值与该值进行比较,以确定是否选择相应的行。

SELECT Name, Description
FROM Products
WHERE Quantity <  2 * (
   SELECT AVG( Quantity )
   FROM SalesOrderItems );