首页 > 数据库 >记一种Oracle中行转列PIVOT函数的替换方案

记一种Oracle中行转列PIVOT函数的替换方案

时间:2024-07-26 14:40:11浏览次数:6  
标签:CODE PC SYS 转列 STATE Oracle PIVOT ID PCD

  在实际工作中,开发可能会碰到数据需要进行 行转列 的查询,第一个想到的就是用Oracle的内置函数PIVOT,但PL可能会说,这种查询的性能可能会不太好,项目上要求不使用这个函数,那么有什么方法实现这种查询呢?

  方案:使用同一张表的row_id来进行关联查询,因为Oracle中表数据的row_id是唯一的。

  直接举例,供参考查阅:

  使用PIVOT函数的SQL:

SELECT  *  FROM (
  SELECT CODE, VOICE, POST
  FROM (SELECT B.PARAM_CODE, C.VALUE, C.ROW_ID
      FROM SYS_A A
      JOIN SYS_B B ON A.ID = B.A_ID
      JOIN SYS_C C ON C.B_ID = B.ID
      WHERE A.GROUP_CODE = 'TEST_CODE'
      AND A.STATE = 'A'
      AND B.STATE = 'A'
      AND C.STATE = 'A'
      AND A.ORG_ID = 123
      AND B.ORG_ID = 123
      AND C.ORG_ID = 123) T
  PIVOT(MAX(T.VALUE)
  FOR PARAM_CODE IN('CODE' AS CODE, 'VOICE' AS VOICE, 'POST' AS POST))
)  T  WHERE CODE='AAAAAA'

  使用row_id关联查询来替换PIVOT函数的SQL:

      SELECT B.VALUE,A.B_ID,B.B_ID

      FROM SYS_C A

      INNER JOIN SYS_C B ON B.ROW_ID = A.ROW_ID
      WHERE A.STATE='A' AND B.STATE='A'
      AND A.ORG_ID=123
      AND A.B_ID IN (SELECT PCD.ID
              FROM SYS_A PC
              INNER JOIN SYS_B PCD ON PC.ID=PCD.A_ID
              WHERE PC.STATE='A' AND PCD.STATE='A'
              AND PC.ORG_ID=123
              AND PC.GROUP_CODE = 'TEST_CODE'
              AND PCD.PARAM_CODE = 'CODE')
      AND B.B_ID IN (SELECT PCD.ID
              FROM SYS_A PC
              INNER JOIN SYS_B PCD ON PC.ID=PCD.A_ID
              WHERE PC.STATE='A' AND PCD.STATE='A'
              AND PC.ORG_ID=123
              AND PC.GROUP_CODE = 'TEST_CODE'
              AND PCD.PARAM_CODE = 'VOICE')
      AND A.VALUE = 'AAAAAA'

 

标签:CODE,PC,SYS,转列,STATE,Oracle,PIVOT,ID,PCD
From: https://www.cnblogs.com/LiusNet/p/18325312

相关文章

  • Oracle数据库状态信息自动化收集脚本
    #!/bin/bash#配置变量ORACLE_SID=CDBORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1PATH=$ORACLE_HOME/bin:$PATHexportORACLE_SIDORACLE_HOMEPATH#数据库登录信息DB_USER=lcsdbDB_PASS=123456PDB_NAME=FS3_LCS#输出文件OUTPUT_DIR=/path/to/output/dire......
  • Oracle数据库监控和运维关注哪些方面
    全面的数据库监控和运维涉及多个方面。以下是一些关键的数据库状态信息,你应该关注这些方面,以确保数据库的健康和性能:1.数据库运行状态数据库状态:检查数据库是否运行正常,了解是否处于OPEN、MOUNT或NOMOUNT状态。实例状态:确保所有实例都正常运行,没有宕机或异常。2.内存使用......
  • Oracle: 创建分区表、分区索引
    ORACLE创建分区表例子:--删除分区表DROPTABLECUX.CUX_PARTITION_TEST;--创建分区表,以GROUP_NAME字段的值进行分区CREATETABLECUX.CUX_PARTITION_TEST(TEST_IDNUMBER,TEST_NAMEVARCHAR2(50),GROUP_NAMEVARCHAR2(30),CREATION_DAT......
  • C#中将多个excel档案汇总为一个excel档,并批量汇入oracle数据库
    privatevoidbt_bach_oracle_Click(objectsender,EventArgse){//將下載的excel匯總為一個excelstringsourceFolder=@"D:\123";//源文件夹路径stringdestinationFolder=@"D:\456";//目标文件夹路径stringdest......
  • 记录oracle迁移达梦的步骤
    1DTS(DM数据迁移工具)迁移应注意检查的相关事项1.1迁移数据可能会导致oracle内存溢出,需要oracle数据库管理人员在1.2先查询出备份表,确认查出来的是备份表,然后drop这些备份表,生产环境可能备份表也需要迁selectt.OWNER,table_name,T.NUM_ROWSfromdba_tabLES......
  • 查看Oracle执行计划以及真实执行计划
    在Oracle数据库中,查看SQL语句的执行计划可以通过以下几种方法:使用AUTOTRACEAUTOTRACE提供一个简单的方法来查看SQL语句的执行计划和统计信息。你可以在SQL*Plus中使用它:启用AUTOTRACE:SETAUTOTRACEON执行你的SQL语句,Oracle会自动显示执行计划和统计信息......
  • Oracle DB 数据准备
    CreateTablecreatetableDEP(deptnonumber,dnamevarchar2(50)notnull,locationvarchar2(50),constraintpk_departmentsprimarykey(deptno));createtableEMP(empnonumber,ename......
  • PART1-Oracle关系数据结构-索引和索引组织表
    3.索引组织表3.1.索引概述索引是与表或表簇关联的可选结构,有时可以加快数据访问速度。通过在表的一个或多个列上创建索引,在某些情况下,您可以从表中检索一小部分随机分布的行。索引是减少磁盘I/O的众多方法之一。如果堆组织表没有索引,那么数据库必须执行全表扫描才能找到一个......
  • oracle大表性能优化
    1不修改表结构的优化1.1收缩表,降低高水位线ALTERTABLETESTENABLEROWMOVEMENT;ALTERTABLETESTSHRINKSPACE;1.2对表收集统计信息BEGINDBMS_STATS.GATHER_TABLE_STATS(ownname=>user,tabname=>'TEST');END;1.3使用oracle的并行查询功......
  • Oracle 中 LISTAGG 函数的介绍以及使用
    原文地址:https://www.cnblogs.com/codeLearn/p/17931924.htmlLISTAGG函数介绍listagg函数是Oracle11.2推出的新特性。其主要功能类似于wmsys.wm_concat函数,即将数据分组后,把指定列的数据再通过指定符号合并。LISTAGG使用listagg函数有两个参数: 1、要合并的......