合并结果集(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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论