Скопируйте вывод подзапроса WITH в CSV в postgres - PullRequest
1 голос
/ 07 февраля 2020

Я пытаюсь сохранить вывод подзапроса 'WITH' ниже в файл CSV.

 WITH mer9 AS (
                SELECT *, 
                        substring(seq_window_mut_9mers, split9.start, 9)
                FROM split9
        ),

    mer23 AS (
                  SELECT *, 
                        substring(seq_window_mut_23mers, split23.start, 23)
                   FROM split23
        ),

    dataset AS (
                SELECT *
                    FROM table 
                    INNER JOIN mer9 ON mer9.seq_window_mut_9mers = table.seq_window_mut_9mers
                    INNER JOIN mer23 ON mer23.seq_window_mut_23mers = table.seq_window_mut_23mers

        )

COPY (SELECT * FROM dataset) TO '/tmp/filename.csv' (format CSV);

После выполнения запроса я получаю сообщение об ошибке:

[Code: 0, SQL State: 42601]  ERROR: syntax error at or near "COPY"
  Position: 3566  [Script position: 3566 - 3570]

1 Ответ

0 голосов
/ 07 февраля 2020

Наборы результатов, сгенерированные из CTE, не могут быть доступны в другом запросе. CTE создает своего рода «временную таблицу», которая существует только в текущем запросе. При этом поместите свой CTE в оператор COPY, он должен работать, например,

COPY (
 WITH mer9 AS (
  SELECT *, substring(seq_window_mut_9mers, split9.start, 9)
  FROM split9),
 mer23 AS (
  SELECT *, substring(seq_window_mut_23mers, split23.start, 23)
  FROM split23),
 dataset AS (
  SELECT * FROM table 
  INNER JOIN mer9 ON mer9.seq_window_mut_9mers = table.seq_window_mut_9mers
  INNER JOIN mer23 ON mer23.seq_window_mut_23mers = table.seq_window_mut_23mers
 )
) TO '/tmp/filename.csv' (format CSV);

Редактировать . Как указано @ a_horse_with_no_name :

Имейте в виду, что эта команда создаст файл на сервере. Если вы хотите sh создать файл с выводом на клиенте, рассмотрите возможность использования STDOUT в вашей команде COPY, например, psql:

$ psql -d yourdb -h yourdbhost -U your_user -c "COPY (WITH..) TO STDOUT" > file.csv

Смотрите также это answer.

...