2013-10-02 2 views
1

Я пытаюсь не только запрашивать различные таблицы в моей базе данных и экспортировать их в CSV, но также экспортировать данные из нескольких таблиц и объединить их в виде столбцов в этот CSV.Oracle: запрос запроса SQLPlus с заголовками

Я начинаю с предпосылкой возможности намотать содержимое таблицы в 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 

So два вопроса:

  • ли это возможно для меня сцепить данные из нескольких таблиц в столбец выход, как указано выше? Как и в создании новых столбцов для вывода вместо добавления к существующим столбцам?

  • Как я могу дать заголовок для моих данных (пользовательских или уже определенных идентификатором в таблице) в верхней части столбца?

+0

Вы хотите 'JOIN' эти таблицы, а не' UNION'. Теперь, как таблицы связаны друг с другом? – peterm

+0

Вы не можете выводить в столбцы независимо. Столбец является частью строки.Даже если у вас нет каких-либо отношений между таблицами, вам нужно «ПРИСОЕДИНЯЙТЕ» их, используя номер строки, например. – peterm

ответ

1

IMHO вы либо присоединяетесь к своим столам, если они связаны друг с другом. Один из способов сделать это, если 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 демо

+0

Мои таблицы связаны между собой (по крайней мере, те, которые я запрашиваю). Однако для этого мне нужно иметь общую колонку? – Signus

+0

Да, это правильно. – peterm

+0

К счастью, большинство моих таблиц имеют один столбец с теми же данными. Я сделаю это. Также SQLFiddle весьма полезен! – Signus

Смежные вопросы