集合子查询

您可使用“集合子查询”来从子查询的结果创建 MULTISET 集合。此语法是对 SQL 的 ANSI/ISO 标准的扩展。

语法

集合子查询

元素 描述 限制 语法
singleton_select 返回正好一行的子查询 子查询不可重复 SELECT 关键字,也不可包括 ORDER BY 子句 SELECT 语句
subquery 嵌入的查询 不可包含 ORDER BY 子句 SELECT 语句

用法

MULTISET 和 SELECT ITEM 关键字有下列重要意义:
  • MULTISET 指定可包括重复值的元素,但没有特定元素的顺序的集合。
  • SELECT ITEM 仅支持 projection 列表中的一个表达式。您不可在单个子查询中重复 SELECT 关键字。
您可在下列上下文中使用集合子查询:
  • SELECT 语句的 Projection 子句和 WHERE 子句
  • INSERT 语句的 VALUES 子句
  • UPDATE 语句的 SET 子句
  • 在您可使用集合表达式的任何地方(即,计算得到单个集合的任何表达式)
  • 作为传递给用户定义的例程的一个参数
下列限制适用于集合子查询:
  • Projection 子句不可包含重复的列(字段)名称。
  • 它不可包含表名称的别名。(但它可使用列(字段)名称的别名,如下列一些示例中那样。)
  • 它是只读的。
  • 不可打开它两次。
  • 它不可包含 NULL 值。
  • 它不可包含尝试在子查询内搜索的语法。
集合子查询返回未命名的 ROW 数据类型的多重集。此 ROW 类型的字段是子查询的 projection 列表中的元素。下列示例访问表和这些语句定义的 ROW 类型:
CREATE ROW TYPE rt1 (a INT);
                        CREATE ROW TYPE rt2 (x int, y rt1);
                        CREATE TABLE tab1 (col1 rt1, col2 rt2);
                        CREATE TABLE tab2 OF TYPE rt1;
                        CREATE TABLE tab3 (a ROW(x INT));
下列结合子查询的示例返回罗列在该子查询右边的 MULTISET 集合。
集合子查询 结果集合
MULTISET (SELECT * FROM tab1)... MULTISET(ROW(col1 rt1, col2 rt2))
MULTISET (SELECT col2.y FROM tab1)... MULTISET(ROW(y rt1))
MULTISET (SELECT * FROM tab2)... MULTISET(ROW(a int))
MULTISET(SELECT p FROM tab2 p)... MULTISET(ROW(p rt1))
MULTISET (SELECT * FROM tab3)... MULTISET(ROW(a ROW(x int)))
下列是另一个集合子查询:
SELECT f(MULTISET(SELECT * FROM tab1 WHERE tab1.x = t.y))
                            FROM t WHERE t.name = 'john doe';
下列集合子查询包括 UNION 运算符:
SELECT f(MULTISET(SELECT id FROM tab1 
                                UNION
                                SELECT id FROM tab2 WHERE tab2.id2 = tab3.id3)) FROM tab3;
1 GBase 8s 扩展