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

 

子查询和 ALL 测试

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

示例

本示例查找在订单 #2001 的所有产品都已发运之后所下的那些订单的订单 ID 和客户 ID。

SELECT ID, CustomerID
FROM SalesOrders
WHERE OrderDate > ALL (
   SELECT ShipDate
   FROM SalesOrderItems
   WHERE ID=2001 );
ID CustomerID
2002 102
2003 103
2004 104
2005 101
... ...

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

有关 ALL 运算符的说明

ALL 测试还有三个重要特性:

  • 子查询结果集为空   如果子查询生成空结果集,则 ALL 测试返回 TRUE。这是有意义的,因为如果没有结果,则对结果集中每一个值的比较测试便为真。

  • 子查询结果集中的值为 NULL   如果对结果集中任意值的比较测试为假,则 ALL 搜索返回 FALSE。如果所有值均为真,则它返回 TRUE。否则,它返回 UNKNOWN—举例来说,如果子查询结果集中有 NULL 值,但搜索条件对所有非 NULL 值均为 TRUE,就可能会发生这种情况。

  • 对 ALL 测试取非   以下表达式 等同。
    NOT a = ALL (subquery)
    a <> ALL (subquery)

    有关此测试的详细信息,请参见跟在 ANY、ALL 或 SOME 之后的子查询