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

 

子查询和 ANY 测试

ANY 测试与 SQL 比较运算符(=、>、<、>=、<=、!=、<>、!>、!<)之一联合使用,它可以将单个值与子查询生成的一列数据值进行比较。为了执行该测试,SQL 使用指定的比较运算符来将测试值与该列中的每一数据值进行比较。如果任一 比较运算生成的结果为 TRUE,ANY 测试便返回 TRUE。

与 ANY 一起使用的子查询必须返回单列。

示例

查找在订单 #2005 的第一批产品已发出之后所发的那些订单的订单 ID 和客户 ID。

SELECT ID, CustomerID
FROM SalesOrders
WHERE OrderDate > ANY (
   SELECT ShipDate
   FROM SalesOrderItems
   WHERE ID=2005 );
ID CustomerID
2006 105
2007 106
2008 107
2009 108
... ...

执行此查询时,主查询根据订单 #2005 每个 产品的发运日期测试每个订单的订单日期。如果某个订单日期晚于订单 #2005 一批 货物的发运日期,则 SalesOrders 中的该 ID 和客户 ID 将成为结果集的一部分。ANY 测试与 OR 运算符类似:可以将上述查询理解为 "此销售订单是在订单 #2005 的第一批产品发运之后所下,是在订单 #2005 的第二批产品发运之后所下,还是……"

理解 ANY 运算符

ANY 运算符可能会造成一点混淆。它很容易使人将该查询理解为 [返回在已发运订单 #2005 的任何产品之后所下的那些订单]。但这意味着该查询将返回订单 #2005 的所有 产品都已发运后所下订单的订单 ID 和客户 ID—这并不是该查询的结果。

请试着改为这样理解该查询:"对于在发运了订单 #2005 的至少一个 产品后所下的订单,返回它们的订单 ID 和客户 ID。"使用关键字 SOME 可以更直观地表达出该查询。以下查询等同于上一查询。

SELECT ID, CustomerID
FROM SalesOrders
WHERE OrderDate > SOME (
   SELECT ShipDate
   FROM SalesOrderItems
   WHERE ID=2005 );

关键字 SOME 等同于关键字 ANY。

与 ANY 运算符有关的说明

ANY 测试还有两个重要特性:

  • 子查询结果集为空   如果子查询生成空结果集,则 ANY 测试返回 FALSE。这是有意义的,因为如果没有任何结果,则至少有一个结果满足比较测试就不成立了。

  • 子查询结果集中的值为 NULL   假设在子查询结果集中至少有一个 NULL 值。如果对于结果集中的所有非 NULL 数据值比较测试均为 FALSE,则 ANY 搜索返回 UNKNOWN。原因在于,在此情况下,您无法明确断定其比较测试为真的子查询是否具有值。可能有也可能没有值,具体情况取决于结果集中 NULL 数据的正确 值。有关 ANY 搜索条件的详细信息,请参见ANY 和 SOME 搜索条件