oracle 如何聚合多行函数
在BEA论坛上看一位"专家"写的大作,一条SQL语句是
select r.xm,
substr(r.csrq,1,4)||'年'||substr(r.csrq,5,2)||'月'||substr(r.csrq,7,2)||'日' csrq,
(select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb,
(select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz,
(select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq,
xz,
xp,
xz,
fwcs
from czrk_jbxx r,rk_zpxx p
where r.gmsfhm=p.gmsfhm and rownum<2
朋友看了一会,然后问我 (select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb, (select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz, (select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq, 这里如何优化,也就是符合条件的三条记录要合并成一条记录.
其实之前有好多这样的问题,但没有一个好的方案,都是嵌套太多,性能损失很大,把三条记录的结果合并.如果最后的sql语句中的select超过三次,那真的还不如直接这样查询.
不过首先这个方法是错误的,因为这三次都在原表中查询,性能损失很大,其实如果是5条,10条,20条,100条.这样的语句写起来就累死人了.
之前有人提供了几个方案,但都是连成字符串还不是形成多列.真正形成多列应该是用分析函数:
这样实际上只能原表做一次查询,然后得到的结果集在显示的时候被提前到一行上形成多列.
select * from (
select name,
lead(name,1) over (order by name) as name1,
lead(name,2) over (order by name) as name2,
lead(name,3) over (order by name) as name3,
lead(name,4) over (order by name) as name4
from tb_customer where 条件
) t
where t.name4 is not null
这样原来的行数越多节省的性能越高,因为实际原表查询只有一次,后来只是对内存中的结果做合并.上面的那个例子就是
select * from (
select dictvalue as mz,
lead(dictvalue,1) over (order by dictcode) as ssxq,
lead(dictvalue,2) over (order by dictcode) as xb,
from zh_dictvalue
where (dictcode=xb and dictname='rk_xb')
or (dictcode=mz and dictname='rk_mz')
or (dictcode=ssxq and dictname='rk_xzqh')
) t
where t.ssxq not null
注意在order by dictcode后,苛as后面的名称被调整了.否则dictvalue和命名的列就不对应了.
分享到:
相关推荐
在Oracle数据库中,有时我们需要将同一列中的多个行值合并为单行文本,这在处理汇总数据或报告时尤其有用。Oracle提供了一种方便的方法来实现这一目标,特别是在Oracle 10g及更高版本中引入的`WMSYS.WM_CONCAT`函数...
4. **optimizer_features_enable**:这个Hint可以用来回退到旧版本的优化器行为,以解决新版本优化器可能导致的问题。 5. **LEADING**:用于指定在连接操作中优先处理的表,有助于优化器选择最佳连接顺序。 6. **...
Oracle数据库通过内部机制自动管理锁的获取和释放,但在高并发环境下,了解锁的行为和避免死锁对于优化应用程序性能至关重要。 #### 结论 理解Oracle数据库中的锁机制对于设计高性能、高可用性的应用系统至关重要...
作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...
在Oracle数据库中,当进行跨多个数据库节点的事务处理时,这个视图可以用于追踪事务的状态和进度。 2. **DBA_2PC_PENDING**: 用于显示等待恢复的分布式事务的信息。这在故障恢复或诊断分布式事务问题时非常有用。 ...
#### 七、合并数据(Oracle 9i) 该章节介绍了Oracle 9i中的MERGE语句,用于根据匹配条件更新或插入数据。包括: - MERGE语句的语法及其工作原理。 - 如何基于匹配条件来更新或插入记录。 - 使用MERGE语句时的注意...
**Oracle E-Business Suite (EBS)** 是一套全面的企业资源规划(ERP)解决方案,它提供了涵盖财务、供应链管理、项目管理等多个领域的功能模块。EBS的核心优势在于其高度可定制性和扩展性,这使得企业可以根据自身...
### Oracle索引使用样例详解 #### 一、索引并行创建 在Oracle数据库中,并行...通过这些示例,我们可以看到Oracle数据库中的索引管理是一个非常复杂且多方面的主题。正确地管理和优化索引对于提高查询性能至关重要。
这些规则通常反映了SQL语句执行的一般行为模式,比如索引使用、表扫描等。 - **规则优先级**:RBO按照规则号的大小顺序来评估执行计划,规则号越小,认为执行效率越高。这种优化方式并不依赖成本函数或统计信息。 - ...
- **JOIN操作**:用于合并多个表的数据,如`INNER JOIN`、`LEFT JOIN`、`RIGHT JOIN`和`FULL JOIN`。 - **GROUP BY和HAVING**:用于数据分组和条件过滤,如`GROUP BY column1, column2 HAVING condition;`。 - **...
- 联合查询可以将多个查询结果合并成一个结果集。 - 分组查询用于按照某个或某些字段对数据进行分组统计。 - **本章总结** - 深入介绍了SQL的基础知识和Oracle中的数据操作方法。 - 通过大量的实例帮助读者掌握...
表分区是Oracle数据库提供的一种高级数据组织方式,它将一个大表分成多个逻辑上独立但物理上存储在一起的部分,每个部分称为一个分区。这样做可以提高数据管理的效率,加速查询性能,并优化维护操作,如备份、恢复和...
`WHERE`子句用于过滤结果,`GROUP BY`和`HAVING`用于分组和条件过滤,`JOIN`则用于合并多个表的数据。 对于数据的增删改,`INSERT INTO`用于插入新记录,`DELETE FROM`用于删除指定的记录,`UPDATE`则用于修改现有...
8. 适当使用索引合并(index skip scan),在多个索引上同时查询,提高效率。 9. 优化表的分区策略,根据数据分布和查询模式选择合适的分区方式。 10. 考虑使用并行查询,特别是处理大量数据时,可以显著提升处理...
连接查询是将多个表的数据合并在一起进行查询的技术。 #### 六、函数 这部分介绍了 Oracle 数据库中常用的函数。 ##### 6.1 字符函数 - `UPPER()`:转换为大写。 - `LOWER()`:转换为小写。 - `TRIM()`:去除...
Oracle数据库在SQL优化方面有很多策略和技术,其中包括对函数的使用、索引的创建以及性能测试。在提供的聊天记录中,提到了几个关键知识点,我们将详细展开讨论。 1. **NVL与DECODE函数的性能差异**: NVL函数用于...
- **Report多数据源**:从多个数据源获取数据并合并生成单一报告。 - **查询视图无数据**:解决报告生成时数据缺失的问题。 - **Report数据域**:定义报告中数据展示的区域。 - **Report汇总项**:汇总数据,生成...
在Oracle中,JOIN操作是连接不同表的关键技术,用于将多个表的数据合并成一个结果集。本篇文章将详细探讨Oracle中的JOIN操作,包括各种类型的JOIN以及它们的使用方式。 1. JOIN概述 在Oracle中,JOIN操作允许我们将...
27. **不明确的索引等级**:避免在多列索引中使用不明确的索引列。 28. **强制索引失效**:在某些特殊情况下,可能需要禁止 Oracle 使用特定索引。 29. **避免在索引列上使用计算**:计算会影响索引的使用,应尽...