【问题标题】:Oracle: SQLPlus Query Concatenate Data With HeadersOracle:SQLPlus 查询将数据与标头连接起来
【发布时间】:2013-10-09 12:35:20
【问题描述】:

我不仅尝试查询数据库中的不同表并将它们导出为 CSV,还尝试从多个表中导出数据并将它们作为列连接到此 CSV。

我的前提是能够将表格的内容转存为 CSV 文件:

set colsep ','
set echo off
set feedback off
set linesize 1000
set sqlprompt ''
set headsep off
spool file.csv
select * from messages;

现在我想抓取多个表的某些组件但无济于事(使用联合和减号):

select col1, col2, col3 from messages
union
select col1, col2 from messagedata
union
select col1 from extradata;

在尝试上述方法时,我会得到ORA -1789 query block has incorrect number of result columns,这意味着我正在尝试匹配错误的列数(我试图通过在输出中附加列来避免这种情况)。

如果给定 unionminus,它会在错误的数据类型上出错,但那是因为它只是试图将它附加到我的第一个查询的列中。

我的目标是创建一个产生类似输出的查询:

| col1(messages)  | ... |  col2(messagedata) | ... |  col3(extradata) |
-----------------------------------------------------------------------
  message         ,...    ,messagedata        ,...   ,extradata      
  message         ,...    ,messagedata        ,...   ,extradata
  message         ,...    ,messagedata        ,...   ,extradata

那么两个问题:

  • 我是否可以像上面那样将多个表中的数据连接到列输出中?就像创建 new 列来输出而不是附加到现有列?

  • 如何为我的数据提供标题(自定义或已由 表中的标识符)在列的顶部?

【问题讨论】:

  • 你想JOIN这些表而不是UNION。现在这些表是如何相互关联的?
  • 您不能单独输出到列中。列是行的一部分。即使您在表之间没有任何关系,您也需要使用例如行号来JOIN 它们。

标签: database oracle sqlplus


【解决方案1】:

恕我直言,如果它们彼此相关,您可以加入您的表。如果col1 是公共列,则一种方法

SELECT COALESCE(m.col1, d.col1, e.col1) column_name1,
       m.col2 column_name2,
       m.col3 column_name3,
       d.col2 column_name4,
       e.col2 column_name5
  FROM messages m FULL JOIN messagedata d
    ON m.col1 = d.col1 FULL JOIN extradata e
    ON d.col1 = e.col1

样本输出:

| COLUMN_NAME1 | COLUMN_NAME2 | COLUMN_NAME3 | COLUMN_NAME4 | COLUMN_NAME5 | |-------------|--------------|--------------|---- ----------|--------------| | 1 |价值12 |价值13 |数据1 |额外数据1 | | 2 |价值21 |价值31 |数据2 |额外数据2 |

或者你UNION他们这样

SELECT col1 column_name1, col2 column_name2, col3 column_name3
  FROM messages
 UNION ALL
SELECT col1, col2, NULL
  FROM messagedata
 UNION ALL
SELECT col1, NULL, NULL
  FROM extradata

注意对于您UNION 的所有SELECTs,列数及其各自的数据类型应该相同。为了克服这个问题,您可以注入常量值(例如NULL)并在需要时将列值转换/转换为某些常见类型(例如VARCHAR2)。

样本输出:

| COLUMN_NAME1 | COLUMN_NAME2 | COLUMN_NAME3 | |-------------|--------------|--------------| | 1 |价值12 |价值13 | | 2 |价值21 |价值31 | | 1 |数据1 | (空) | | 2 |数据2 | (空) | | 1 | (空) | (空) | | 2 | (空) | (空) |

这里是SQLFiddle演示

【讨论】:

  • 我的表都是相关的(至少我正在查询的表)。但是为了做到这一点,我需要有一个共同的列?
  • 幸运的是,我的大多数表都有一个包含相同数据的列。我会试一试。 SQLFiddle 也很有用!
  • 好的。听起来很棒!祝你好运。如果您觉得答案对您有帮助,请考虑accept
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多