sql - oracle中的行到列
问题描述
我有两个结果集的案例,我需要将它们合并为一个结果集。多次进行各种查询以获得所需的输出但失败了。
这些是结果集。
select drc.rc_column_name from dyna_report_columns drc;
select * from REPORT1;
我想要做的是将结果从rc_column_name
不同的列作为单行获取到下一个结果集。
解决方案
我正计划使报告充满活力”
您需要一个可以处理任意数量的列的解决方案。所以你不能这样做是一个常规查询。您需要使用动态 SQL 来动态组装投影。
这意味着执行动态 SQL 语句并返回弱引用游标的存储过程或函数。同样,它必须是一个引用游标,因为这是唯一可以处理可变投影的构造。引用游标与 JDBC ResultSet 和 ODBC ResultSet 以及大多数常见前端编程语言中的等效项兼容。
这是一个使用您发布的表格的功能:
create or replace function get_any_report return sys_refcursor
is
stmt varchar2(32767);
rc sys_refcursor;
begin
select 'select 1 as row_type, ' ||
listagg(''''||rc_column_name||''' as col'||trim(to_char(rc_seq)), ',') within group (order by rc_seq)
||' from dual'
||' union all
select 2 as row_type, r1.*
from report1 r1
order by 1, 2'
into stmt
from dyna_report_columns ;
dbms_output.put_line(stmt);
open rc for stmt;
return rc;
end;
/
ORDER BY 子句中引用了一个附加列row_type
,以保证标题行是结果集的第一行。
这是一个 Oracle LiveSQL 演示。抱歉,您需要一个免费的 Oracle 帐户来运行它,但 SQL Fiddle 目前有点不稳定。
这是演示的 SQL Fiddle 版本,但 Fiddle 不支持 DBMS_OUTPUT。
推荐阅读
- typescript - 这个 TypeScript 函数的正确返回类型是什么?
- swift - 查询 Firestore 数据库的日期范围
- angular - 如何处理 Firebase 身份验证状态的响应时间
- javascript - 基于旧数据的预测/预测
- javascript - 再次运行 puppeteer 函数直到完成
- python - 流连接丢失:AssertionError(('_AsyncTransportBase._produce() tx 缓冲区大小下溢', -275, 1),)
- c++ - 如何将文件发送到服务器
- java - 如何清除 EditText 中的文本?
- c++ - 如何在 C++ 中创建子类
- c++ - 如何在 CppUTest 中使用 MockSupportPlugin 自动执行 checkExpectations?