H2: повторяющиеся имена столбцов в запросе подсчета с вложенным запросом - PullRequest
0 голосов
/ 08 октября 2018

Мне интересно, возможно ли сохранить имена таблиц во вложенном запросе, чтобы избежать ошибки Duplicate column name.

В качестве минимального примера у меня есть следующие таблицы:

  • ЗАКАЗЧИКИ: ИД, ИМЯ, CITY_ID
  • ГОРОДА: ИД, ИМЯ, ZIP

Следующий запрос завершается ошибкой Duplicate column name "NAME":

SELECT COUNT(*) FROM (
  SELECT CUSTOMERS.NAME, CITY.NAME 
  FROM CUSTOMERS JOIN CITIES ON CUSTOMERS.CITY_ID = CITIES.ID
)

Очевидно, H2 обрезает имена таблиц во вложенном запросе, в результате чего появляются два столбца с именем NAME (см. Ошибка COUNT с подзапросом в базе данных H2 с "Дублирующимся именем столбца" ).

AРешением было бы использовать псевдоним столбца во вложенном запросе, но я бы хотел избежать этого из-за других требований проекта (т. е. я хотел бы использовать идентификаторы столбцов, сгенерированные с помощью Jooq для построения запросов).

ДелатьВы знаете способ заставить H2 хранить имена таблиц во вложенном запросе?

1 Ответ

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

Проблема

Это известная проблема jOOQ, связанная с использованием DSLContext.fetchCount(Select): https://github.com/jOOQ/jOOQ/issues/7867

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

jOOQ должен устранить неоднозначность имен столбцов следующим образом:

SELECT COUNT(*) FROM (
  SELECT CUSTOMERS.NAME AS C1, CITY.NAME AS C2
  FROM CUSTOMERS JOIN CITIES ON CUSTOMERS.CITY_ID = CITIES.ID
)

Но этосложно, так как на столбцы можно ссылаться из предложения ORDER BY (что может потребоваться из-за предложения LIMIT / FETCH), поэтому проблема еще не решена.

Временные решения

Вам придется обойти это самостоятельно.У вас есть 3 варианта:

  • Переписать запрос при выполнении подсчета или переписать его вообще, используя псевдонимы столбцов
  • Запустить обычный запрос подсчета, вручную
  • InH2 1.4.198 (еще не выпущено на сегодняшний день), будут реализованы оконные функции, поэтому вы можете проецировать выражение COUNT(*) OVER () для вычисления значения счетчика в каждой строке.
...