Ошибка вставки SQL на i.name не существует, хотя кажется, что во время вставки

Я использую Postgres SQL и pgAdmin. Я пытаюсь скопировать данные между промежуточной таблицей и рабочей таблицей, используя INSERT INTO с оператором SELECT FROM с to_char по пути. Это может быть или не быть неправильным подходом. SELECT терпит неудачу, потому что, по-видимому, «столбец i.dates не существует».

Возникает вопрос: Почему я получаю сообщение "столбец i.dates не существует"?

Схема для обеих таблиц идентична, за исключением преобразования даты.

Я пытался сопоставить схему таблиц, за исключением преобразования to_char. Я проверил и дважды проверил, что столбец существует.

Это код, который я пытаюсь:

INSERT INTO weathergrids (location, dates, temperature, rh, wd, ws, df, cu, cc)
  SELECT
    i.location AS location,
    i.dates as dates,
    i.temperature as temperature,
    i.rh as rh,
    i.winddir as winddir,
    i.windspeed as windspeed, 
    i.droughtfactor as droughtfactor,
    i.curing as curing,
    i.cloudcover as cloudcover
  FROM (
      SELECT location, 
             to_char(to_timestamp(dates, 'YYYY-DD-MM HH24:MI'), 'HH24:MI YYYY-MM-DD HH24:MI'), 
             temperature, rh, wd, ws, df, cu, cc 
       FROM wosweathergrids
  ) i;

Ошибка, которую я получаю:

ERROR:  column i.dates does not exist
LINE 4:  i.dates as dates,
         ^
SQL state: 42703
Character: 151

Моя схема данных выглядит так:


+-----------------+-----+-------------+-----------------------------+-----+
|      TABLE      | NUM |   COLNAME   |          DATATYPE           | LEN |
+-----------------+-----+-------------+-----------------------------+-----+
| weathergrids    |   1 | id          | integer                     |  32 |
| weathergrids    |   2 | location    | numeric                     |   6 |
| weathergrids    |   3 | dates       | timestamp without time zone |     |
| weathergrids    |   4 | temperature | numeric                     |   3 |
| weathergrids    |   5 | rh          | numeric                     |   4 |
| weathergrids    |   6 | wd          | numeric                     |   4 |
| weathergrids    |   7 | wsd         | numeric                     |   4 |
| weathergrids    |   8 | df          | numeric                     |   4 |
| weathergrids    |   9 | cu          | numeric                     |   4 |
| weathergrids    |  10 | cc          | numeric                     |   4 |
| wosweathergrids |   1 | id          | integer                     |  32 |
| wosweathergrids |   2 | location    | numeric                     |   6 |
| wosweathergrids |   3 | dates       | character varying           |  16 |
| wosweathergrids |   4 | temperature | numeric                     |   3 |
| wosweathergrids |   5 | rh          | numeric                     |   4 |
| wosweathergrids |   6 | wd          | numeric                     |   4 |
| wosweathergrids |   7 | ws          | numeric                     |   4 |
| wosweathergrids |   8 | df          | numeric                     |   4 |
| wosweathergrids |   9 | cu          | numeric                     |   4 |
| wosweathergrids |  10 | cc          | numeric                     |   4 |
+-----------------+-----+-------------+-----------------------------+-----+


person anakaine    schedule 23.09.2019    source источник


Ответы (1)


В вашей производной таблице (подзапросе) с именем i нет столбца с именем dates, потому что столбец dates "скрыт" в функции to_char() и поскольку он не определяет псевдоним для этого выражения, столбец dates недоступен "за пределами" производного стол.

Но я не вижу причин для производной таблицы с самого начала. Кроме того: псевдоним столбца с тем же именем также не нужен i.location as location - это то же самое, что и i.location.

Таким образом, ваш запрос можно упростить до:

INSERT INTO weathergrids (location, dates, temperature, rh, wd, ws, df, cu, cc)
SELECT
    location,
    to_timestamp(dates, 'YYYY-DD-MM HH24:MI'),
    temperature,
    rh,
    winddir,
    windspeed, 
    droughtfactor,
    curing,
    cloudcover
FROM wosweathergrids

Вам не нужно давать псевдоним выражению to_timestamp(), так как столбцы сопоставляются по положению, а не по имени в выражении insert ... select.

person a_horse_with_no_name    schedule 23.09.2019