Oracle 19c中如何将两列数据合并为一列并按ID去重?
Oracle 19c 实现按ID去重并合并两列数据
问题场景
现有数据表(假设表名为test_table),示例数据如下:
| id | first_numbers | second_numbers |
|---|---|---|
| 10 | 123 | 111 |
| 10 | 122 | 123 |
| 10 | 111 | 124 |
| 11 | 333 | 111 |
| 11 | 444 | 222 |
| 11 | 222 | 124 |
需要实现:将first_numbers和second_numbers两列的值合并到同一列,同时按id去除重复值,最终得到如下结果:
| id | concatenated_columns |
|---|---|
| 10 | 123 |
| 10 | 111 |
| 10 | 122 |
| 10 | 124 |
| 11 | 333 |
| 11 | 111 |
| 11 | 222 |
| 11 | 124 |
解决方案
可以通过UNION ALL将两列数据行转列,再结合DISTINCT或GROUP BY实现按id去重,具体SQL语句如下:
方法1:使用DISTINCT
SELECT DISTINCT id, concatenated_columns FROM ( SELECT id, first_numbers AS concatenated_columns FROM test_table UNION ALL SELECT id, second_numbers AS concatenated_columns FROM test_table ) t ORDER BY id, concatenated_columns;
方法2:使用GROUP BY
SELECT id, concatenated_columns FROM ( SELECT id, first_numbers AS concatenated_columns FROM test_table UNION ALL SELECT id, second_numbers AS concatenated_columns FROM test_table ) t GROUP BY id, concatenated_columns ORDER BY id, concatenated_columns;
语句说明
- 内层子查询:通过
UNION ALL将first_numbers和second_numbers两列的数据分别作为单独的行输出,保留所有原始数据(包括重复项)。 - 外层查询:使用
DISTINCT或GROUP BY对每个id对应的数值进行去重,确保同一id下的数值唯一。 - ORDER BY:可选,用于按
id和合并后的列排序,使结果更规整。
内容的提问来源于stack exchange,提问作者Arifullah
相关产品推荐
相关产品推荐

