联合

联合运算使用 UNION 运算符将两个查询组合成单个复合查询。可以在两个或多个 SELECT 语句之间使用 UNION 运算符来产生一个临时表,它包含存在于任何一个原始表或所有原始表中的行。还可以在视图的定义中使用 UNION 运算符。

不能在下列上下文的子查询内使用 UNION 运算符
  • 在 SELECT 语句的 Projection 子句中
  • 在 SELECT 、INSERT 、DELETE 或 UPDATE 语句的 WHERE 子句中
然而,UNION 运算符在 SELECT 语句的 FROM 子句中的子查询中是有效的,如下所示:
SELECT * FROM (SELECT col1 FROM tab1 WHERE col1 = 100) AS vtab1(c1),
          (SELECT col1 FROM tab2 WHERE col1 = 10 
          UNION ALL 
          SELECT col1 FROM tab1 WHERE col1 < 50 ) AS vtab2(vc1);

GBase 8s 不支持对 ROW 类型进行排序。由于 UNION 操作需要排序以除去重复值,所以当联合运算中的任一查询包括 ROW 类型数据时,不能使用 UNION 操作符。但是,数据库服务器确实支持具有 ROW 类型数据的 UNION ALL,这是因为此类运算无需排序。

下图举例说明了 UNION 集合运算。

图: 联合集合运算


This figure is described in the surrounding text.

UNION 关键字选择两个查询中的所有行,除去重复行并返回余下的行。因为查询的结果组合为一个结果,所以每个查询中的投影列表必须具有相同的列数。同时,从每个表选择的相应列必须包含兼容的数据类型(CHARACTER 数据类型列的长度必须相同),并且这些相应的列必须全部允许或全部不允许 NULL 值。

有关 SELECT 语句和 UNION 运算符的完整语法,请参阅 GBase 8s SQL 指南:语法。有关特定于 GBase 8s ESQL/C 产品和涉及 INTO 子句和复合查询的任何限制的信息,请参阅 GBase 8s ESQL/C 程序员手册

下列查询对 stockitems 表中的 stock_nummanu_code 列执行联合。

图: 查询

SELECT DISTINCT stock_num, manu_code FROM stock
          WHERE unit_price < 25.00
          UNION
          SELECT stock_num, manu_code FROM items
          WHERE quantity > 3; 
该查询选择单价小于 $25.00 或预订数量大于三的那些商品并列出其 stock_nummanu_code,如下所示。

图: 查询结果

stock_num manu_code
          
          5 ANZ
          5 NRG
          5 SMT
          9 ANZ
          103 PRC
          106 PRC
          201 NKL
          301 KAR
          302 HRO
          302 KAR