Oracle:SQLPlus查询使用标头连接数据

时间:2013-10-02 23:41:32

标签: database oracle sqlplus

我不仅要查询数据库中的不同表并将它们导出为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;

现在我想抓住多个表的某些组件而无效(使用union和minus):

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,这意味着我正在尝试匹配错误的列数(我试图通过在输出中添加列来避免这种情况)。< / p>

如果 union 减去,它将在错误的数据类型上出错,但这是因为它只是试图将它附加到我的第一个查询的列中。 / p>

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

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

所以有两个问题:

  • 我是否可以将多个表中的数据连接到上面的列输出中?与在create new 列中输出而不是附加到现有列一样?

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

1 个答案:

答案 0 :(得分: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 |      value12 |      value13 |        data1 |   extradata1 |
|            2 |      value21 |      value31 |        data2 |   extradata2 |

或以这种方式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

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

示例输出:

| COLUMN_NAME1 | COLUMN_NAME2 | COLUMN_NAME3 |
|--------------|--------------|--------------|
|            1 |      value12 |      value13 |
|            2 |      value21 |      value31 |
|            1 |        data1 |       (null) |
|            2 |        data2 |       (null) |
|            1 |       (null) |       (null) |
|            2 |       (null) |       (null) |

这是 SQLFiddle 演示