【问题标题】:SQL Getting multiple rows from a single rowSQL 从单行获取多行
【发布时间】:2015-10-01 19:47:10
【问题描述】:

我需要完成以下工作:

我有一个包含多列 (c1, c2, c3, c4 ... cn) 的表。

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

r1c1 r1c2 r1c3
r1c4 r1c5 r1c6
...
r1cn-2 r1cn-1 r1cn

r2c1 r2c2 r2c3
r2c4 r2c5 r2c6
...
r2cn-2 r2cn-1 r2cn

...

rxc1 rxc2 rxc3
rxc4 rxc5 rxc6
...
rxcn-2 rxn-1 rxcn

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

有什么建议吗?

谢谢!

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

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

a b c d e f h i j

第 2 行是

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

【问题讨论】:

  • 尝试将其实现为 PL-SQL 函数。在那里,您可以构建您需要的算法。您可以通过查询数据库元数据来获取表的列名,并将其交叉到您的行数据中。
  • 似乎有点不清楚您要实现的目标,您是否需要在同一行的同一行上返回与列名连接的列值? edit: 如 col1 col2 col3 x y z a b c 并且您希望打印为: xcol1 ycol2 zcol3 (第一行) acol1 bcol2 ccol3 (第二行) ?
  • 所以您基本上是在尝试对表中的列进行自动换行?对我来说,这听起来更像是 UI 演示问题,而不是数据问题。无论如何,也许最简单的方法是首先将所有内容扁平化为一列,然后将它们聚集成短行。
  • 您好,请查看编辑。比你
  • 如果你不能改变数据库,你就不能使用PL/SQL(这意味着你要创建一个存储过程)

标签: sql plsql rows multiple-columns unpivot


【解决方案1】:

所以数字 1,如果您在原始表中有一定数量的列可以被 3 整除,那么您可以执行那么多 UNION ALL。

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

【讨论】:

    【解决方案2】:

    n 可被3 整除的简单情况只需使用rownumunion

    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
    

    SQLFiddle demo

    【讨论】:

    • 谢谢,这就是我要避免的,因为在实际情况下,我有 10 列而不是 3 列和 400 列,所以我最终得到了 40 个联合,而且我的查询对于应用程序来说太长了。
    猜你喜欢
    • 1970-01-01
    • 2012-05-06
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多