HSQLDB: INSERT INTO ... (SELECT NULL, * FROM) приводит к «дублированию имени столбца» - PullRequest
0 голосов
/ 08 октября 2018

В HSQLDB у меня есть две TEXT таблицы, сопоставленные с файлами CSV.См. Проект CSV Cruncher .

CREATE TEXT TABLE session_telephony_pins ( Op VARCHAR(4092), id ... )

Я пытаюсь добавить столбец в эту «входную» таблицу, чтобы у результата был уникальный идентификатор для каждой таблицы.

Так что это кажется вполне логичным: добавьте этот столбец, определенный как последовательность,

CREATE TEXT TABLE output ( crunchCounter BIGINT
  GENERATED BY DEFAULT AS SEQUENCE crunchCounter PRIMARY KEY, op VARCHAR(4092), ... )

и затем используйте null, чтобы позволить БД выбрать значение:

INSERT INTO output (SELECT NULL AS crunchCounter, * FROM apollo_session_occurrence)
-- I also tried withhout `AS ...`

Однако еслине работает с:

SQLSyntaxErrorException duplicate column name in derived table

Таблицы и типы столбцов:

* APOLLO_SESSION_OCCURRENCE
  - OP                           CHARACTER VARYING
  - SESSION_OCCURRENCE_ID        SMALLINT
  - SESSION_ID                   SMALLINT
  - START_TIME                   TIMESTAMP
  - END_TIME                     TIMESTAMP
  - UID                          UUID
* OUTPUT
  - CRUNCHCOUNTER                BIGINT
  - OP                           CHARACTER VARYING
  - SESSION_OCCURRENCE_ID        CHARACTER VARYING
  - SESSION_ID                   CHARACTER VARYING
  - START_TIME                   CHARACTER VARYING
  - END_TIME                     CHARACTER VARYING
  - UID                          CHARACTER VARYING

Я думаю, что в MySQL это будет работать, но не проверял.

Типы не должныбыть проблемой.Если я опущу столбец crunchCounter и просто сделаю INSERT INTO output (SELECT * FROM apollo_session_occurrence), он будет работать нормально.

Теоретически я могу использовать NEXT VALUE FOR crunchCounter, но это не изменит метаданные столбцов.Это происходит, когда HSQLDB проверяет метаданные.

Что происходит?И,

Как мне заполнить таблицу output уникальным столбцом?

Редактировать: Интересно, что он хорошо работает с другими таблицами и специально именованными столбцами результатов:

INSERT INTO output (SELECT NULL AS crunchCounter,  jobName, buildNumber, config, ar, arFile, deployDur, warmupDur, scale,
  CAST(warmupDur AS DOUBLE) / CAST(deployDur AS DOUBLE) AS warmupSlower
  FROM concat ORDER BY deployDur)

* CONCAT
 - JOBNAME                      CHARACTER VARYING
 - BUILDNUMBER                  SMALLINT
 - CONFIG                       CHARACTER VARYING
 - AR                           CHARACTER VARYING
 - ARFILE                       CHARACTER VARYING
 - DEPLOYDUR                    SMALLINT
 - WARMUPDUR                    SMALLINT
 - SCALE                        SMALLINT
* OUTPUT
 - CRUNCHCOUNTER                BIGINT
 - JOBNAME                      CHARACTER VARYING
 - BUILDNUMBER                  CHARACTER VARYING
 - CONFIG                       CHARACTER VARYING
 - AR                           CHARACTER VARYING
 - ARFILE                       CHARACTER VARYING
 - DEPLOYDUR                    CHARACTER VARYING
 - WARMUPDUR                    CHARACTER VARYING
 - SCALE                        CHARACTER VARYING
 - WARMUPSLOWER                 CHARACTER VARYING

Начинает выглядеть как ошибка HSQLDB.

1 Ответ

0 голосов
/ 08 октября 2018

разобрался.Проблема в том, что HSQLDB расширяет * в SELECT 1 AS foo, * FROM myTable до foo, foo, myTable.col1, ....

Это ИМО ошибка.Изменить: Не ошибка, но HSQLDB может дать лучшее сообщение об ошибке.

Обходной путь: Использовать квалифицированный подстановочный знак.

INSERT INTO output (SELECT NULL AS crunchCounter, 
        apollo_session_occurrence.* 
   FROM apollo_session_occurrence ...)
...