1

我不仅尝试查询数据库中的不同表并将它们导出到 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意思是我正在尝试匹配错误的列数(我试图通过在输出中添加列来避免这种情况)。

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

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

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

所以两个问题:

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

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

4

1 回答 1

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

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

样本输出:

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

这是SQLFiddle演示

于 2013-10-03T00:16:53.060 回答