`
载营魄抱一
  • 浏览: 10152 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle 实现查主表并取日志表前 N 行行转列

阅读更多
下面SQL的目标是实现在查询主表记录的同时将对应的前三行日志的操作类型、操作时间、操作remark作为9列显示
 --建立测试表,初始化数据
CREATE TABLE TEST_MAIN(
   ID NUMBER,
   NO VARCHAR2(200)
);

CREATE TABLE TEST_MAIN_LOG(
   LOG_ID NUMBER,
   ID NUMBER,
   OPR_TYPE VARCHAR2(2),
   NO VARCHAR2(200),
   OPR_DATE DATE,
   REMARK VARCHAR2(4000)
);


DECLARE I NUMBER;J NUMBER;
BEGIN
  I:=1;
  J:=1;
  LOOP
INSERT INTO TEST_MAIN VALUES(J,TO_CHAR(SYSDATE,'YYYYMMDD')||J);
INSERT INTO TEST_MAIN_LOG VALUES(I,J,0,TO_CHAR(SYSDATE,'YYYYMMDD')||J,SYSDATE-10,'TEST');
I:=I+1;
INSERT INTO TEST_MAIN_LOG VALUES(I,J,1,TO_CHAR(SYSDATE,'YYYYMMDD')||J,SYSDATE-9,'TEST');
I:=I+1;
INSERT INTO TEST_MAIN_LOG VALUES(I,J,2,TO_CHAR(SYSDATE,'YYYYMMDD')||J,SYSDATE-8,'TEST');
I:=I+1;
INSERT INTO TEST_MAIN_LOG VALUES(I,J,3,TO_CHAR(SYSDATE,'YYYYMMDD')||J,SYSDATE-7,'TEST');
I:=I+1;
J:=J+1;
COMMIT;
 EXIT WHEN I>200;
END LOOP;
END;

--查询SQL
SELECT T.ID,
       MAX(T.NO) AS NO,
       MAX(CASE ROW_IDX
             WHEN 1 THEN
              DECODE(LOG_.OPR_TYPE,
                     0,
                     '操作类型1',
                     1,
                     '操作类型2',
                     2,
                     '操作类型3')
             ELSE
              NULL
           END) OPR_TYPE_1,
       MAX(CASE ROW_IDX
             WHEN 1 THEN
              LOG_.OPR_DATE
             ELSE
              NULL
           END) OPR_DATE_1,
       MAX(CASE ROW_IDX
             WHEN 1 THEN
              LOG_.REMARK
             ELSE
              NULL
           END) OPR_REMARK_1,
       MAX(CASE ROW_IDX
             WHEN 2 THEN
              DECODE(LOG_.OPR_TYPE,
                     0,
                     '操作类型1',
                     1,
                     '操作类型2',
                     2,
                     '操作类型3')
             ELSE
              NULL
           END) OPR_TYPE_2,
       MAX(CASE ROW_IDX
             WHEN 2 THEN
              LOG_.OPR_DATE
             ELSE
              NULL
           END) OPR_DATE_2,
       MAX(CASE ROW_IDX
             WHEN 2 THEN
              LOG_.REMARK
             ELSE
              NULL
           END) OPR_REMARK_2,
       MAX(CASE ROW_IDX
             WHEN 3 THEN
              DECODE(LOG_.OPR_TYPE,
                     0,
                     '操作类型1',
                     1,
                     '操作类型2',
                     2,
                     '操作类型3')
             ELSE
              NULL
           END) OPR_TYPE_3,
       MAX(CASE ROW_IDX
             WHEN 3 THEN
              LOG_.OPR_DATE
             ELSE
              NULL
           END) OPR_DATE_3,
       MAX(CASE ROW_IDX
             WHEN 3 THEN
              LOG_.REMARK
             ELSE
              NULL
           END) OPR_REMARK_3
  FROM (SELECT COUNT(LOG.LOG_ID)  -- 利用分析函数算出当前日志行属于主表的记录的第几行日志
               OVER(PARTITION BY LOG.ID 
                    ORDER BY LOG.OPR_DATE 
                    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) ROW_IDX,
               LOG.*
          FROM TEST_MAIN_LOG LOG) LOG_,
       TEST_MAIN T
 WHERE T.ID = LOG_.ID(+)
 GROUP BY T.ID
 ORDER BY T.ID
分享到:
评论

相关推荐

    oracle动态行转列

    本文将深入探讨如何通过Oracle中的存储过程实现动态“行转列”,并结合给定文件的信息,详细解析其工作原理、优点及应用场景。 ### 核心知识点:Oracle动态行转列 #### 1. 存储过程与动态SQL 存储过程是预编译的...

    oracle实现行转列功能,并使用逗号进行隔开拼接,成为一条数据.pdf

    Oracle 实现行转列功能并使用逗号进行隔开拼接成为一条数据 Oracle 中实现行转列功能,并使用逗号进行隔开拼接,成为一条数据是指将多行数据合并成一行数据,并用逗号分隔每个字段的值。这种功能在实际应用中非常...

    Oracle行转列(不定列)

    本篇文章将详细探讨Oracle如何实现行转列为列的过程,以及在面对不确定列数时的解决方案。 在传统的SQL查询中,数据通常是以行的形式存储和展示。然而,在某些场景下,我们可能需要将同一类别的数据从多行转换为一...

    oracle查询表的所有列并用逗号隔开

    在Oracle数据库环境中,有时我们需要...总之,通过以上步骤和示例代码,你可以有效地在Oracle数据库中实现查询表的所有列并用逗号隔开的功能。这种方法不仅适用于单一表的操作,也可以扩展到更复杂的多表处理场景中。

    oracle 查询列最大值

    oracle 查询列最大值,例如有n例值,但是要找出这些列中的最大值。

    Oracle行转列之pivot

    在Oracle数据库中,行转列(也称为数据透视)和列转行(unpivot)是SQL查询中用于数据转换的高级功能。从Oracle 11g版本开始,引入了PIVOT和UNPIVOT关键字,以支持显式的查询转换,即从行数据转换为列数据,或从列...

    oracle数据库日志查看方法

    ### Oracle数据库日志查看方法详解 #### 一、概述 Oracle数据库是企业级应用中广泛使用的数据库管理系统之一,为了确保数据库系统的稳定运行和快速定位问题,掌握Oracle数据库日志查看方法至关重要。本文将详细...

    oracle行转列

    总的来说,这些文档覆盖了Oracle数据库的核心功能,对于理解并掌握Oracle的行转列操作和其他高级SQL技巧,以及PL/SQL编程都大有裨益。通过深入学习和实践,数据库管理员和开发人员能够更高效地管理和操作Oracle...

    SqlServer表结构转oracle表结构

    在数据库管理领域,将SQL Server的表结构转换到Oracle数据库是一项常见的需求,特别是在系统迁移或数据整合的过程中。本文将详细探讨如何实现这一过程,并提供C#开发源码的相关信息。 首先,我们需要理解SQL Server...

    oracle中实现列转行实例

    oracle中实现列转行实例,有表的创建,数据的插入,查询的sql

    如何在oracle中查询所有用户表的表名、主键名称、索引、外键等

    根据提供的标题、描述以及部分代码内容,我们可以了解到这篇文章主要探讨的是如何在Oracle数据库中查询所有用户表的相关信息,包括表名、主键名称、索引、外键等元数据信息。接下来,我们将对这些知识点进行详细的...

    Oracle的列转行问题

    列转行(Pivot)和行转列(Unpivot)是两种基本操作,可以将数据按照不同的维度进行组织。传统的列转行方法通常涉及`DECODE`或`CASE`函数与聚合函数如`MAX`或`MIN`的结合,但这些方法可能在处理大量数据时对性能造成...

    深入分析oracle日志文件

    Oracle 日志文件是 Oracle 数据库管理员 (DBA) 实现数据库恢复和追踪用户操作的重要工具。通过分析 Oracle 日志文件,可以追踪用户的恶意操作、恢复误删除的数据、执行事后审计等。Oracle 公司提供的 LogMiner 是一...

    oracle 行转列

    在提供的链接中,博主李佩霄分享了关于Oracle行转列的具体实践,可以进一步学习和探讨。而`行转列.sql`文件很可能是包含此类操作的实际SQL脚本,你可以运行并观察其效果,加深对这个功能的理解。在实际工作中,熟练...

    查看登录oracle数据库用户记录.docx

    要查看登录 Oracle 数据库的用户记录,可以创建一个临时日志表,并建立一个数据库表触发器来记录用户的登录行为。 创建临时日志表 首先,需要创建一个临时日志表来存储用户的登录记录。可以使用以下 SQL 语句来...

    oracle行转列,列转行的例子

    oracle行转列,列转行的例子

    Mysql的表对象Sql语句转换单表,转换成Oracle创建表sql

    6. **测试与验证**:完成转换后,应在目标Oracle环境中创建表并导入数据,以确保转换正确无误。这包括检查所有字段、索引、约束和数据类型的兼容性。 7. **复杂情况处理**:如果MySQL表有触发器、存储过程或其他...

    Oracle清除归档日志

    归档日志是数据库系统为了实现数据恢复而产生的日志文件,当数据库处于归档模式时,每一次完整的数据库备份后都会生成归档日志。随着时间的推移,这些归档日志会占用大量的磁盘空间,因此定期清理不再需要的归档日志...

Global site tag (gtag.js) - Google Analytics