2

我的问题是,有一些背景:

我必须根据表元数据(列格式)生成一些 sql 查询,结果类似于:

TABLENAME1|COL1
TABLENAME1|COL2
TABLENAME2|COL1
TABLENAME2|COL2
TABLENAME2|COL3
TABLENAME3|COL1
TABLENAME4|COL1
TABLENAME4|COL2
... /*some other 1800 rows */

(是的,它是有序的。)我需要的是根据第一列转置这些数据,所以预期的输出是:

TABLENAME1|COL1|COL2|NULL
TABLENAME2|COL1|COL2|COL3
TABLENAME3|COL1|NULL|NULL
TABLENAME4|COL1|COL2|NULL
/* less then 1800 rows ;-) */

是否可以使用 Oracle SQL?

提前致谢!

4

2 回答 2

2

如果您想为每个调用生成查询或使用硬编码的 max-column-count,那么您可以执行以下操作:

WITH tab AS
(
  SELECT table_name, column_name FROM user_tab_cols WHERE column_id <= 4
) -- user_tab_cols used to provide test data, use your table instead
SELECT MAX(c1) c1,
       MAX(c2) c2,
       MAX(c3) c3,
       MAX(c4) c4
  FROM (SELECT table_name,
               DECODE( column_id, 1, column_name ) c1,
               DECODE( column_id, 2, column_name ) c2,
               DECODE( column_id, 3, column_name ) c3,
               DECODE( column_id, 4, column_name ) c4
          FROM ( SELECT table_name,
                        column_name,
                        ROW_NUMBER() OVER ( PARTITION BY table_name ORDER BY column_name ) column_id
                   FROM tab
               )
       )
 GROUP BY table_name
 ORDER BY table_name

如果以那种形式获得它就足够了

TABLENAME1|COL1,COL2
TABLENAME2|COL1,COL2,COL3

看看 Tom Kyte 的stragg

于 2009-11-24T06:58:21.967 回答
1

您要查找的关键字是pivot. 是它的使用示例。语法看起来通常与 MSSQL 相同,由于我不知道 Oracle 文档的 url,我将折腾MSDN链接并希望比我更了解 Oracle 页面布局的人会编辑它以指向他们的文档.

编辑:Oracle 文档,搜索支点足够的时间,你会得到细节。

于 2009-11-24T05:37:14.437 回答