从一行中获取多行的SQL

从一行中获取多行的SQL,sql,plsql,rows,multiple-columns,unpivot,Sql,Plsql,Rows,Multiple Columns,Unpivot,我需要完成以下工作: 我有一个多列的表(c1,c2,c3,c4…cn) 我想要一个以以下方式返回多行的查询(r1 r2..rx是原始表中的行): 我知道我可以使用联合并将基本相同的查询重复n次,但我需要在基于web的报告系统中使用该查询,而我无法控制该系统,并且该查询对于查询中允许的最大字符数来说太大了 有什么建议吗 谢谢大家! 编辑:仅供参考,我正在使用无法更改的数据库在无法更改的报告工具中生成报告。因此,使用自定义函数/过程不是解决方案。它必须是PL-SQL查询 更具体地说,我需要原始行中有

我需要完成以下工作:

我有一个多列的表(c1,c2,c3,c4…cn)

我想要一个以以下方式返回多行的查询(r1 r2..rx是原始表中的行):

我知道我可以使用联合并将基本相同的查询重复n次,但我需要在基于web的报告系统中使用该查询,而我无法控制该系统,并且该查询对于查询中允许的最大字符数来说太大了

有什么建议吗

谢谢大家!

编辑:仅供参考,我正在使用无法更改的数据库在无法更改的报告工具中生成报告。因此,使用自定义函数/过程不是解决方案。它必须是PL-SQL查询

更具体地说,我需要原始行中有多行,假设第1行是

a b c d e f h i j
第二排是

1 2 3 4 5 6 7 8 9
然后我会得到下表,其中有3列:

a b c
d e f 
h i j
1 2 3
4 5 6
7 8 9

第一,如果原始表中有一组可以被3整除的列,那么就可以进行这么多的并集


您唯一的其他选项是pivot或指针,这两个选项都不会更好。

因此,第1个选项是,如果原始表中有一组列数可被3整除,那么您只需执行许多UNION ALL即可


您唯一的其他选项是pivot或指针,两者都不会更好。

n
可被
3
整除时,只需使用
rownum
union

WITH T1 AS
(
   SELECT rownum as rn,1 as tNum, c1 as s1,c2 as s2,c3 as s3 FROM T
   UNION ALL
   SELECT rownum as rn,2 as tNum, c4 as s1,c5 as s2,c6 as s3 FROM T
   UNION ALL
   SELECT rownum as rn,3 as tNum, c7 as s1,c8 as s2,c9 as s3 FROM T
)
SELECT s1,s2,s3 FROM T1 
ORDER BY rn,tNum

n
可被
3
整除时,只需使用
rownum
union

WITH T1 AS
(
   SELECT rownum as rn,1 as tNum, c1 as s1,c2 as s2,c3 as s3 FROM T
   UNION ALL
   SELECT rownum as rn,2 as tNum, c4 as s1,c5 as s2,c6 as s3 FROM T
   UNION ALL
   SELECT rownum as rn,3 as tNum, c7 as s1,c8 as s2,c9 as s3 FROM T
)
SELECT s1,s2,s3 FROM T1 
ORDER BY rn,tNum

尝试将其作为PL-SQL函数实现。在那里,您可以构建所需的算法。您可以通过查询数据库元数据获取表的列名,并将其与行数据交叉。似乎不太清楚您试图实现的目标,是否需要在同一行的同一行上返回与列名连接的列值?编辑:与col1 col2 col3 x y z a b c一样,您希望打印为:xcol1 ycol2 zcol3(第一行)acol1 bcol2 ccol3(第二行)?那么您基本上是在尝试对表中的列进行文字换行吗?对我来说,这听起来更像是一个UI演示问题,而不是一个数据问题。无论如何,最简单的方法可能是首先将所有内容展平为一列,然后将它们聚成短行。您好,请查看编辑。如果不能更改数据库,就不能使用PL/SQL(这意味着要创建存储过程)尝试将其实现为PL-SQL函数。在那里,您可以构建所需的算法。您可以通过查询数据库元数据获取表的列名,并将其与行数据交叉。似乎不太清楚您试图实现的目标,是否需要在同一行的同一行上返回与列名连接的列值?编辑:与col1 col2 col3 x y z a b c一样,您希望打印为:xcol1 ycol2 zcol3(第一行)acol1 bcol2 ccol3(第二行)?那么您基本上是在尝试对表中的列进行文字换行吗?对我来说,这听起来更像是一个UI演示问题,而不是一个数据问题。无论如何,最简单的方法可能是首先将所有内容展平为一列,然后将它们聚成短行。您好,请查看编辑。如果你不能更改数据库,你就不能使用PL/SQL(这意味着你想创建一个存储过程)谢谢,这正是我试图避免的,因为在实际情况中,我有10列,而不是3列和400列,因此我最终有40个联合,我的查询对于应用程序来说太长了。谢谢,这正是我试图避免的,因为在实际情况中,我有10列,而不是3列和400列,因此我最终有40个联合,我的查询对于应用程序来说太长了。