带有子查询的条件

在条件内包括 SELECT 语句,指定带有子查询的条件。您可在 SELECT、INSERT、DELETE 或 UPDATE 语句中使用子查询来执行下列这样的任务:
带有子查询的条件

子查询可依赖于外部 SELECT 语句正在求值的当前行;在此情况下,该子查询称为相关的子查询。(要获取相关的子查询及其对性能的影响的讨论,请参阅 GBase 8s SQL 教程指南。)

下列部分描述子查询条件及其语法。

依赖于子查询的上下文,子查询可返回单个值、无值或值集。如果子查询返回值,它必须仅选择单个列。如果子查询简单地检查一行(或多行)是否存在,则它可选择任何数目的行和列。

子查询不可引用 BYTE 或 TEXT 列,也不可包含 ORDER BY 子句。然而,在 FROM 子句中指定表表达式的子查询可包括 ORDER BY 子句。

如果子查询的 FROM 子句指定外部语句在这些子句之一中引用的同一表或视图,则子查询及其外部 DML 语句在同一表对象上操作:
仅在 DELETE 或 UPDATE 语句的 WHERE 子句中,那些返回多行和与括起来的 DML 语句操作的同一表或视图的子查询才是有效的。即使在此上下文中,这样的子查询也返回错误 -360,除非满足所有下列条件:

下列程序片断包括在 UPDATE 和 DELETE 语句中带有子查询的条件的示例:

CREATE TABLE t1 ( a INT, a1 INT)
      CREATE TABLE t2 ( b INT, b1 INT) ;
      . . .
      UPDATE t1 SET a = a + 10 WHERE EXISTS  
      (SELECT a FROM t1 WHERE a > 1);
      UPDATE t1 SET a = a + 10 WHERE a IN
      (SELECT a FROM t1, t2  WHERE a > b 
      AND a IN
      (SELECT a FROM t1 WHERE a > 50 ) );
      DELETE FROM t1 WHERE EXISTS 
      (SELECT a FROM t1);
    

要获取更多关于在 DELETE 语句中的子查询的信息,请参阅 DELETE 的 WHERE 子句中的子查询

要获取更多关于在 UPDATE 语句中的子查询的信息,请参阅 UPDATE 的 WHERE 子句中的子查询

1 请参阅 EXISTS 子查询条件
2 请参阅 IN 子查询
3 请参阅 ALL、ANY 和 SOME 子查询