我不仅要查询数据库中的不同表并将它们导出为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 列中输出而不是附加到现有列一样?
我如何为我的数据(自定义或已定义的)提供标题 表格中的标识符)在列顶部?
答案 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 演示