关于oracle多条记录合并为一条记录的方法

今天正还有同学问了一个问题,怎么把两条不同的记录合并成一条记录从数据库里面拿出来,oracle数据库。
拿到之后首先想的是,分两条sql语句去查,然后在程序里做拼接。经过沟通发现,同学的需求不是这个样子的,是要求一条sql语句获取两条记录并合并他们,数据库学的比较菜,上来就写了一个很白痴的sql

select id,
(select col from table where id=t.id and flag=1)colA,
(select col from table where id=t.id and flag=2)colA
from table t where id='123'

后续问题出来了,同学表里面并没有flag,后来想到了ROWNUM,可以通过排序后,拿到前两条记录,在做上面的查询,但是同学的table并不是单一的一张表,是又多表联合得到的,而且定位一条记录时,要通过几个条件才可以。后来在网上查询了一下,多出提到的是wmsys.wm_concat函数,但是并不符合要求,wmsys.wm_concat是将多列合并到一块,而我们需要的是分不同字段显示。最后发现了一篇帖子http://bbs.csdn.net/topics/390691977。
大体思路是,先对分组对组内编号,在对组内要合并的行做操作。这里用到了max(decode(colnum,1,col2,null));
分组,组内编号

select col1,col2,row_number()over(partition by col1 order by col2)colnum from COL_TO_ROW

over: 在什么条件之上。
partition by e.deptno: 按部门编号划分(分区)。
order by e.sal desc: 按工资从高到低排序(使用rank()/dense_rank() 时,必须要带order by否则非法)
rank()/dense_rank()/row_number: 分级
整个语句的意思就是:选择col1,col2,并且按照col1的值进行分组,组内按照col2的值排列,在此基础上进行编号。
那么rank()和dense_rank()有什么区别呢?
rank(): 跳跃排序,如果有两个第一级时,接下来就是第三级。
dense_rank(): 连续排序,如果有两个第一级时,接下来仍然是第二级。
row_number():从1-n,忽略重复记录

decode函数含义解释:
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

该函数的含义如下:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF
decode(字段或字段的运算,值1,值2,值3)

因为在使用group by 时,有一个规则需要遵守,即出现在select列表中的字段,如果没有在组函数中,那么必须出现在group by 子句中。(select中的字段不可以单独出现,必须出现在group语句中或者在组函数中。)所以这里又在decode外面套了一层函数。
wmsys.wm_concat是将符合条件的列按照逗号分割将他们相加。

SQL> select id,wmsys.wm_concat(name) over (order by id) name from idtable;
 ID NAME
---------- --------------------------------------------------------------------------------
  10 ab,bc,cd
  10 ab,bc,cd
  10 ab,bc,cd
  20 ab,bc,cd,hi,ij,mn
  20 ab,bc,cd,hi,ij,mn
  20 ab,bc,cd,hi,ij,mn

上面两个函数都要配合GROUP BY 使用。
order by 和groub by 同时出现时,order by 的栏位必须在group by 中有

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle 数据库中,可以使用 UNION ALL 操作符一次性插入多条记录。UNION ALL 操作符的语法如下: ``` INSERT INTO table_name (column1, column2, column3) SELECT value1, value2, value3 FROM DUAL UNION ALL SELECT value4, value5, value6 FROM DUAL UNION ALL SELECT value7, value8, value9 FROM DUAL; ``` 在这个语法中,我们可以通过多个 SELECT 语句来一次性插入多条记录,每个 SELECT 语句都返回一条记录。在每个 SELECT 语句中,我们需要指定要插入的列名和值。最后,我们需要使用一个 INSERT INTO 语句来结束 UNION ALL 操作符,并在 INSERT INTO 子句中指定要插入的表名和列名。 下面是一个示例代码: ``` INSERT INTO employees (employee_id, first_name, last_name) SELECT 1001, 'John', 'Doe' FROM DUAL UNION ALL SELECT 1002, 'Jane', 'Doe' FROM DUAL UNION ALL SELECT 1003, 'Bob', 'Smith' FROM DUAL; ``` 在这个示例代码中,我们一次性向 employees 表中插入了三条记录,分别是 employee_id 为 1001、1002 和 1003 的员工信息。注意,每个 SELECT 语句必须以分号结尾,而整个 INSERT INTO 语句也必须以分号结尾。 需要注意的是,UNION ALL 操作符会将所有的记录合并成一个结果集,然后再将这个结果集插入到表中。因此,如果插入的记录数量比较大,可能会影响性能。如果要插入的记录数量较多,建议使用 INSERT ALL 语句。 希望这个回答能够解决你的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值