Как перенести скрипт postgres в скрипт hsqldb?

У меня есть скрипт, который я успешно запускаю в postgres db, однако он не работает при запуске в hsqldb. Может ли кто-нибудь помочь мне изменить этот sql, чтобы он работал как для HSQLDB, так и для Postgres DB? Ниже мой скрипт:

UPDATE tableA af
SET columnA2 = b.columnB2
from
  ( select columnB1, columnB2 from.....) as b
Where af.columnA1 = b.columnB1;

Это вызывает следующее исключение, когда я запускаю его в hsqldb:

Вызвано: java.sql.SQLSyntaxErrorException: пользователю не хватает привилегий или объект не найден: b.columnB2 Вызвано: org.hsqldb.HsqlException: пользователю не хватает привилегий или объект не найден: b.columnB2

Спасибо.


Обновлено: я создал еще одно представление, чтобы сделать мой вопрос более понятным.

table_A имеет 2 столбца: company_code, company_number и view_B имеет 2 столбца: company_code, company_number_correct_answer

table_A имеет 10000 строк, а view_B имеет только 2 строки. Я хочу обновить 2 записи в table_A, при этом company_code существует в view_B и установить table_A.company_number = view_B.company_number_correct_answer


person Son Pham    schedule 24.04.2019    source источник
comment
Пожалуйста, опубликуйте весь запрос. Обратите внимание, что HSQLDB и Postgres используют существенно различающийся синтаксис.   -  person Tim Biegeleisen    schedule 24.04.2019
comment
Не связано, но: from (select ... from b) as b можно упростить до from b для Postgres   -  person a_horse_with_no_name    schedule 24.04.2019
comment
@TimBiegeleisen: я не могу загрузить весь запрос из-за личной внутренней информации. Однако проблема в том, что: HSQLDB не понимает псевдоним.   -  person Son Pham    schedule 24.04.2019
comment
Тогда вы должны использовать HQL или JPA, которые не зависят от базы данных.   -  person Tim Biegeleisen    schedule 24.04.2019
comment
@TimBiegeleisen: Моя система использует скрипт liquibase для обновления данных в таблице, а hsqldb используется в тестовой среде. Созданное приложение SpringBoot дает сбой при запуске liquibase. Вот почему я сказал, что мне нужно исправить этот простой запрос как для hsqldb, так и для postgres.   -  person Son Pham    schedule 24.04.2019


Ответы (2)


В стандартном SQL предложение FROM (или JOIN или подобное) недопустимо для инструкции UPDATE.

Если вам нужен оператор UPDATE, который работает с несколькими продуктами баз данных, вам придется использовать связанный подзапрос:

update table_a
  set columna2 = (select columnb2
                  from table_b 
                  where table_b.columnb1 = table_a.columna1)
where exists (select * 
              from table_b 
              where table_b.columnb1 = table_a.columna1);

Обратите внимание, что для этого требуется, чтобы table_b.columnb1 был уникальным или первичным ключом, иначе подзапрос вернет более одной строки, что приведет к ошибке).

person a_horse_with_no_name    schedule 24.04.2019
comment
Я не могу использовать ваш запрос, потому что он обновит всю таблицу table_a с тем же значением для columna2. Вот почему я использовал псевдоним и добавил предложение WHERE снаружи. Он работал в postgres, но в hsqldb не понимает псевдоним. - person Son Pham; 24.04.2019
comment
Обновил мой вопрос. Не могли бы вы проверить. - person Son Pham; 24.04.2019
comment
@SonPham: вам нужно условие WHERE, которое обновляет только строки, в которых существует совпадение. Смотрите мое редактирование - person a_horse_with_no_name; 24.04.2019
comment
Если этот ответ решил ваш вопрос, пожалуйста, примите его, чтобы ваш вопрос помечен как решенный. - person a_horse_with_no_name; 24.04.2019

Вы также можете использовать MERGE в HSQLDB.

MERGE INTO tableA af
USING (select columnB1, columnB2 from.....) as b
ON af.columnA1 = b.columnB1
WHEN MATCHED THEN
UPDATE SET af.columnA2 = b.columnB2
person fredt    schedule 24.04.2019