在开发过程中经常碰到要实现按照某一字段,将其它字段中不同的值连接后显示到一行上的需求。本人总结了以下几种方法,在实际开发中可以参考。
建立表结构,在Oracle9i上。
CREATE TABLE temp
(
DEPTNO int,
ENAME varchar(20 BYTE),
SEX varchar(20 BYTE),
AGE varchar(20 BYTE)
);
insert into temp values(10,'aaa','F','18');
insert into temp values(10,'bbb','F','19');
insert into temp values(10,'ccc','F','20');
insert into temp values(20,'ddd','M','21');
insert into temp values(20,'eee','M','22');
insert into temp values(20,'fff','M','23');
insert into temp values(30,'hhh','X','24');
insert into temp values(30,'ggg','X','25');
insert into temp values(30,'yyy','X','26');
insert into temp values(30,'ttt','X','27');
commit;
第一种写法:
SELECT DISTINCT FIRST_VALUE (deptno) OVER (PARTITION BY deptno ORDER BY lv DESC) AS deptno,
FIRST_VALUE (ename) OVER (PARTITION BY deptno ORDER BY lv DESC) AS ename
FROM (SELECT deptno, SYS_CONNECT_BY_PATH (ename, ' ') ename,
LEVEL lv FROM (SELECT deptno, ename,
LAG (ename, 1, NULL) OVER (PARTITION BY deptno ORDER BY ename) ename_1
FROM (SELECT deptno, ename FROM temp))
CONNECT BY PRIOR ename = ename_1
ORDER BY deptno)
结果如下:
10| aaa bbb ccc
20| ddd eee fff
30| ggg hhh ttt yyy
改进后可以增加一列如下:
SELECT DISTINCT FIRST_VALUE (deptno) OVER (PARTITION BY deptno ORDER BY lv DESC) AS deptno,
FIRST_VALUE (sex) OVER (PARTITION BY sex ORDER BY lv DESC) AS sex,
FIRST_VALUE (ename) OVER (PARTITION BY deptno ORDER BY lv DESC) AS ename
FROM (SELECT deptno, sex, SYS_CONNECT_BY_PATH (ename, ' ') ename, LEVEL lv
FROM (SELECT deptno, ename, sex,
LAG (ename, 1, NULL) OVER (PARTITION BY deptno ORDER BY ename) ename_1
FROM (SELECT deptno, ename, sex FROM temp))
CONNECT BY PRIOR ename = ename_1
ORDER BY deptno)
结果如下:
10|F| aaa bbb ccc
20|M| ddd eee fff
30|X| ggg hhh ttt yyy
第二种写法:
SELECT deptno, SYS_CONNECT_BY_PATH (ename, ' ') AS ename, sex,
SYS_CONNECT_BY_PATH (age, ' ') AS age
FROM (SELECT deptno, ename, sex, age, RANK () OVER (ORDER BY deptno)
+ ROW_NUMBER () OVER (ORDER BY deptno) rn,
ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY deptno) rm
FROM temp) a1
WHERE a1.ROWID IN (SELECT MAX (a2.ROWID) FROM temp a2 WHERE a2.deptno = a1.deptno)
START WITH rm = 1
CONNECT BY PRIOR rn = rn - 1
结果如下:
10| aaa bbb ccc|F| 18 19 20
20| ddd eee fff|M| 21 22 23
30| hhh ggg yyy ttt|X| 24 25 26 27
出自:http://hi.baidu.com/rel_conquer/blog/item/fb3bb6f3a7a5185d352acc08.html
Oracle中SYS_CONNECT_BY_PATH函数是非常重要的函数,下面就为您介绍一个使用SYS_CONNECT_BY_PATH函数的例子,实例如下:
-
create table test (a varchar2(10),b varchar2(10));
-
-
INSERT INTO TEST (A, B) VALUES ('1', '我');
-
INSERT INTO TEST (A, B) VALUES ('1', '们');
-
INSERT INTO TEST (A, B) VALUES ('2', '一');
-
INSERT INTO TEST (A, B) VALUES ('2', '起');
-
COMMIT;
-
-
SELECT A, B FROM TEST
-
-
A B
-
---------- ----------
-
1 我
-
1 们
-
2 一
-
2 起
-
-
现在需要达到如下的效果,
-
A B
-
---------- ----------
-
1 我,们
-
2 一,起
-
只想用一句sql来返回结果。
-
SELECT A, LTRIM(MAX(SYS_CONNECT_BY_PATH(B, ',')), ',') B
-
FROM (SELECT B, A, ROW_NUMBER() OVER(PARTITION BY A ORDER BY B DESC) RN
-
FROM TEST)
-
START WITH
RN
=
1
-
CONNECT BY RN -
1
=
PRIOR
RN
-
AND
A
=
PRIOR
A
-
GROUP BY A;
其中,SYS_CONNECT_BY_PATH函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示。
row_number函数的用途是非常广泛,这个函数的功能是为查询出来的每一行记录生成一个序号。生产序号的方法通过over()函数里面的语句来控制。
分享到:
相关推荐
PB脚本中SQL语句写法与SQL中语句写法对照 PB脚本中SQL语句写法与SQL中语句写法对照是非常重要的知识点,因为PB脚本和SQL语言在写法和应用中有所不同。本文将对PB脚本中SQL语句写法和SQL中语句写法进行对比和分析。 ...
综上所述,"泛微系统SQL语句大全"是一份宝贵的资源,它包含了构建、管理和优化泛微系统所需的各种SQL技巧和实例。无论你是系统管理员、开发人员还是数据分析者,都能从中受益,提升你在泛微系统中的工作效率和数据...
该资源提供了两个实例,第一个实例展示了如何使用 SQL 语句从 Excel 文件中提取数据,并将结果复制到另一个工作表中。第二个实例展示了如何使用条件格式来标记不相同的行记录。 第一个实例:使用 SQL 语句提取数据 ...
题目中的描述指出,需要将两张无关联表中的数据列合并到一个结果集中。这里提到的“无关联表”意味着这两张表之间没有直接的关联字段或键值,因此不能直接通过JOIN等常规方式来实现数据的联接。为了完成这个任务,...
超长SQL语句并没有一个明确的长度界限来定义,通常指的是那些结构复杂、包含大量字段或条件的SQL查询语句。这类语句往往难以阅读与维护,且可能存在性能问题。 ##### 常见场景 1. **数据导出/导入**:在进行大批量...
以下是一些常见的SQL语句写法来实现这一目标。 1. **LEFT OUTER JOIN** 方法: ```sql UPDATE file_manager_folder f1 LEFT OUTER JOIN file_manager_folder f2 ON f1.name = f2.name AND f2.parentId = 54 ...
这个SQL语句的工作原理是,对于A表中的每一行,它都会执行四个子查询,每个子查询都查找B表中B1字段等于A表相应字段(A1、A2、A3、A4)的B2字段值。这样,结果集就会展示出A表和B表关联后的信息,即每个A表记录对应...
综上所述,OA系统中的SQL语句广泛应用于数据的导入、更新、查询和迁移,是系统运行和维护的关键。掌握和熟练运用这些SQL语句,对于优化OA系统的性能、提高工作效率具有重要意义。同时,理解和编写这类脚本也是IT人员...
这篇内容主要探讨了如何使用SQL语句获取一天、一周、一月内的数据。首先,我们创建了一个名为`t`的表,包含`id`和`addTime`两个字段,`addTime`字段存储的是日期时间类型,默认值为'0000-00-00 00:00:00'。然后,...
SQL语句是数据库操作的核心,主要用于插入(INSERT)、更新(UPDATE)和查询数据。在数据库管理系统中,这些操作是日常开发和维护中的基本任务。本文将深入探讨如何使用SQL语句生成工具,特别是针对INSERT和UPDATE...
动态拼接SQL语句在IT行业中是一个常见的编程实践,尤其在数据库操作中,它允许根据程序运行时的条件或变量来构建SQL查询。这一技术在处理复杂查询逻辑、灵活的数据筛选以及减少代码冗余等方面具有显著的优势。然而,...
在MySQL数据库管理中,熟练掌握建表、修改字段、添加字段和创建索引的SQL语句是至关重要的。以下是对这些操作的详细说明: 1. **建表**: 使用`CREATE TABLE`语句来创建新的数据库表。例如,创建一个名为`bulletin...
- 将查询结果复制到`sheet2`中的A5单元格开始的位置。 - **关键点分析**: - `CONN.Open`:使用Microsoft Jet数据库引擎打开数据库连接,这里指定了Excel 8.0的数据源路径。 - SQL语句使用了`WHERE`子句来限定...
【SQL语句练习提高】 在SQL中,查询和操作数据是其核心功能。以下通过给出的练习题目,我们将深入理解SQL的基本句式和用法。 28. 题目要求从`employee`表中抽取部门名称(depart_name),计算平均工资(avg(wage)...
### SQL语句优化在提升数据查询效率中的关键作用 在当今数据驱动的业务环境中,数据库的性能直接影响到企业的运营效率和服务质量。其中,SQL(Structured Query Language)作为数据库查询的标准语言,其语句的优化...
`VALUES`关键字则可以用于求表达式的值或者创建临时行集,如将数字、字符串或者表达式的结果转化为一行或多行。 DB2还允许一些独特的SQL写法,例如,`AnyOneTable`表示任意一个存在的表,这在某些特定情况下非常...
这段代码定义了一个插入语句,将`MemberAccessLog`模型对象的所有字段插入到`MemberAccessLog`表中。`#accessLogId#`, `#memberId#`等为动态参数,它们会被替换为实际的值。 #### 3. 查询操作:统计成员特定时间段...