Oracle Union Union All 对查询结果集操作

在Oracle中提供了三种类型的集合操作: 并(UNION)、交(INTERSECT)、差(MINUS)

Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;

Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。

可以在最后一个结果集中指定Order by子句改变排序方式。

--测试表A中的记录见下
select * from TestA;

--对两个结果集进行并集操作,不包括重复行
select * from TestA where id<3 union select * from TestA where id<6;

--对两个结果集进行并集操作,包括重复行行
select * from TestA where id<3 union all select * from TestA where id<6;

--对两个结果集进行交集操作,不包括重复行
select * from TestA where id<3 intersect select * from TestA where id<6;

--对两个结果集进行差操作(前面的结果集减去后面的),不包括重复行
select * from TestA where id<6 minus select * from TestA where id<3;

--对三个结果集进行取并集操作(取到的结果是从左到右依次的值不进行排序)在最后进行order by 操作
select * from (select * from TestA where id>5 union all select * from TestA where id<3 union all select * from TestA where id<2) order by id asc;

select * from (select * from TestA where id>5 union all select * from TestA where id<3 union all select * from TestA where id<2) order by id desc;

 

 

### Oracle 中使用 `UNION ALL` 查询结果合并成一行的方法 在 Oracle 数据库中,如果希望将多个 `UNION ALL` 子查询结果合并为单行输出,可以采用多种方式实现这一目标。一种常见的方式是通过聚合函数来处理这些子查询结果。 #### 使用列聚合函数 对于较新的 Oracle 版本(11g 及以上),推荐使用内置的 `LISTAGG()` 函数来进行字符串连接操作: ```sql WITH data AS ( SELECT column_name FROM table_name WHERE condition UNION ALL SELECT column_name FROM another_table WHERE other_condition ) SELECT LISTAGG(column_name, ', ') WITHIN GROUP (ORDER BY column_name) AS combined_result FROM data; ``` 这段 SQL 语句首先定义了一个名为 `data` 的公共达式(CTE),它包含了两个不同格中的数据并通过 `UNION ALL` 进行组合;接着在外层查询中利用 `LISTAGG()` 将所有来自 CTE 的记录按指定顺序拼接起来形成单一字段输出[^1]。 #### 对于旧版本数据库 如果是更早版本的 Oracle,则可能需要依赖第三方包如 `WM_CONCAT()` 或者自定义 PL/SQL 函数来完成相同的功能。这里给出基于 `WM_CONCAT()` 的例子: ```sql WITH data AS ( SELECT column_name FROM table_name WHERE condition UNION ALL SELECT column_name FROM another_table WHERE other_condition ) SELECT wm_concat(DISTINCT column_name) as concatenated_values FROM data; ``` 需要注意的是,在某些情况下,`wm_concat` 返回的结果可能会被截断至一定长度以内,并且该功能并非官方支持的标准特性[^2]。 另外还可以考虑创建自己的聚函数以适应特定需求,但这通常涉及到较为复杂的编程工作并且超出了简单查询优化讨论范围之外[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值