Сбой SQL Вставить на i.name не существует, когда это кажется, во время вставки - PullRequest
0 голосов
/ 23 сентября 2019

Я использую Postgres SQL и pgAdmin.Я пытаюсь скопировать данные между промежуточной таблицей и рабочей таблицей, используя INSERT INTO с оператором SELECT FROM с to_char по пути.Это может или не может быть неправильный подход.ВЫБРАТЬ не удается, потому что, по-видимому, "столбец 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 |
+-----------------+-----+-------------+-----------------------------+-----+

1 Ответ

2 голосов
/ 23 сентября 2019

Ваша производная таблица (подзапрос) с именем 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 заявление.

...