暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T 合并结果集(UNION)

墨天轮 2019-10-12
816

合并结果集(UNION)

GaussDB 100提供UNION运算符,将多个查询块的结果集合并为一个结果集输出。

语法格式

select_statement UNION [ALL] select_subquery

使用方法

  • 每个查询块的查询列数目必须相同。
  • 每个查询块对应的查询列必须为相同数据类型或同一数据类型组,不同数据类型组或不支持组合的数据类型不允许执行UNION操作。

    数据类型的分组和合并规则如表1所示。

  • 关键字ALL的意思是保持所有重复数据,而没有ALL的情况下表示删除所有重复数据。
表1 数据类型组

数据类型组

数据类型

合并规则及优先级

数值类型

NUMBER/ (DECIMAL)

  • 若合并的查询列数值类型相同,且其精度以及小数位数相同,则合并结果返回为原数值类型,且合并结果保留该精度和小数位。
  • 若合并的查询列数值类型不相同,则按照优先级返回优先级高的数值类型。优先级为:

    NUMBER>BINARY_DOUBLE>BINARY_BIGINT>BINARY_INTEGER

  • 若合并的查询列,数值类型的精度以及小数位数不同,则返回值默认不指定精度和小数位数。

BINARY_DOUBLE

BINARY_INTEGER

BINARY_BIGINT

字符串类型

CHAR(size [BYTE | CHAR])

  • 若合并的查询列数值类型相同,且长度(size)以及储存的类型相同,则合并结果返回为原数值类型,且合并结果长度(size)以及储存的类型与原类型相同。
  • 若合并的查询列数值类型不同,按照优先级返回优先级高的数值类型。优先级为:VARCHAR>CHAR。
  • 若合并的查询列数值类型不同,但储存类型相同时,合并结果返回值继承原储存类型,且长度(size)取查询列的最大值。
  • 若合并的查询列数值类型不同,且储存类型不同时,GaussDB 100默认字符类型转化率(CHAR_TO_BYTES_RATIO)的值为6,假设列A为(n1 char),列B为(n2 byte),计算x=n1×CHAR_TO_BYTES_RATIO。
    • 若x<=n2,合并结果返回类型的长度为n2,不带char属性。
    • 若x>n2,合并结果返回类型的长度取MAX(n1, n2),带char属性。

VARCHAR(size [BYTE | CHAR])

二进制类型

BINARY

  • 若合并的查询列数值类型不相同,则按照优先级返回优先级高的数值类型。优先级为:VARBINARY>BINARY
  • 合并返回值的长度(size),取两个查询列的最大值。

VARBINARY

RAW

RAW类型不能和BINARY、VARBINARY类型合并结果集。

日期类型

DATE

  • 日期类型的数据可以互相合并,优先级为:

    TIMESTAMP WITH TIME ZONE>TIMESTAMP WITH LOCAL TIME ZONE>TIMESTAMP>DATE

  • 合并查询返回值精度取查询列的最大值,DATE类型的精度按0计算。

TIMESTAMP

TIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP WITH TIME ZONE

时间间隔类型

INTERVAL YEAR TO MONTH

  • 不同的时间间隔类型不能合并结果集。
  • 同类型时间间隔类型,合并查询返回值精度取查询列的最大值。

INTERVAL DAY TO SECOND

布尔类型

BOOLEAN

-

LOB类型

CLOB

不同的LOB类型不能合并结果集。

BLOB

IMAGE

示例

查询获得奖金超过7000的员工信息。

--删除表bonuses_depa1。 DROP TABLE IF EXISTS bonuses_depa1;
--删除表bonuses_depa2。 DROP TABLE IF EXISTS bonuses_depa2;
--创建表bonuses_depa1。 CREATE TABLE bonuses_depa1(staff_id INT NOT NULL, staff_name CHAR(50), job VARCHAR(30), bonus NUMBER);
--创建表bonuses_depa2。 CREATE TABLE bonuses_depa2(staff_id INT NOT NULL, staff_name CHAR(50), job VARCHAR(30), bonus NUMBER);
--向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(23,'wangxia','developer',5000); --向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(24,'limingying','tester',7000); --向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(25,'liulili','quality control',8000); --向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(29,'liuxue','tester',8000); --向表bonuses_depa1中插入数据。 INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(21,'caoming','document developer',11000); --提交。 COMMIT;
--向表bonuses_depa2中插入记录1。 INSERT INTO bonuses_depa2(staff_id, staff_name, job, bonus) VALUES(30,'wangxin','developer',9000); --向表bonuses_depa2中插入记录2。 INSERT INTO bonuses_depa2(staff_id, staff_name, job, bonus) VALUES(31,'wangxufeng','document developer',6000); --向表bonuses_depa2中插入记录3。 INSERT INTO bonuses_depa2(staff_id, staff_name, job, bonus) VALUES(34,'denggui','quality control',5000); --向表bonuses_depa2中插入记录4。 INSERT INTO bonuses_depa2(staff_id, staff_name, job, bonus) VALUES(33,'liuying','quality control',10000); --向表bonuses_depa2中插入记录5。 INSERT INTO bonuses_depa2(staff_id, staff_name, job, bonus) VALUES(35,'caojiongming','document developer',12000); --提交事务。 COMMIT;
--查询获得奖金超过7000的员工信息。 SELECT staff_id, staff_name, bonus FROM bonuses_depa1 WHERE bonus > 7000 UNION ALL SELECT staff_id, staff_name, bonus FROM bonuses_depa2 WHERE bonus > 7000 ; STAFF_ID STAFF_NAME BONUS ------------ -------------------------------------------------- ---------------------------------------- 30 wangxin 9000 33 liuying 10000 35 caojiongming 12000 25 liulili 8000 29 liuxue 8000 21 caoming 11000 6 rows fetched.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论