JOOQ вставить в синтаксис выбора с указанными столбцами - PullRequest
2 голосов
/ 22 января 2012

Может ли JOOQ сделать синтаксис "вставить в выбор" для указанных столбцов?Я запускаю несколько разных попыток ..

Таблицы:

table1 (ожидаемая вставка)

<b>id   column1   column2    column3 ...  timestamp</b>
1    John      Leo        null         2012/1/28 23:32:23    (Expected insert)

table2

<b>id   col1   col2   col3  </b>
101  John   xxx    xxx     (from table2.col1)
102  xxx    xxx    xxx

table3

<b>
id   col1   col2   col3  </b>
101  xxx    Leo    xxx     (from table3.col2)
102  xxx    xxx    xxx
INSERT INTO table1 ( column1, column2 )
SELECT  table2.col1, table3.col2
FROM table2 join table3 t3 on table2.id = table3.id 
where table2.id = 101;

Код JOOQ:

create.insertInto(table1, column1, column2 )
      .values( create.select( table2.col1, table3.col2 )
                     .from(table2)
                     .join(table3)
                     .on( table12.id.equal(table3.id) )
                     .where( table2.id.equal(101) ))
     .execute(); //.getSQL();

Сообщение об ошибке JOOQ show:

The number of values must match the number of fields

Кто-нибудь знает, какую проблему я создаю и как я могу исправить свой код JOOQ.спасибо, Pay.

Ссылка: Пример: поддержка синтаксиса INSERT SELECT

1 Ответ

4 голосов
/ 23 января 2012

Вы используете синтаксис INSERT .. VALUES вместо синтаксиса INSERT .. SELECT.Ваш подзапрос предоставляет значения column1, но вы не предоставляете значение для column2.То, что вы хотите сделать, описано далее в руководстве в разделе «Пример: поддержка синтаксиса INSERT SELECT».В вашем случае это будет выглядеть следующим образом (синтаксис jOOQ 2.x, более недоступный в jOOQ 3.x):

create.insertInto(table1, 
create.select( table2.col1, table3.col2 )
      .from(table2)
      .join(table3)
      .on( table12.id.equal(table3.id) )
      .where( table2.id.equal(101) ))
      .execute(); //.getSQL();

Или с пользовательской проекцией (синтаксис jOOQ 3.x):

create.insertInto(table1, column1, column2)
      .select(create.select(...))
      .execute();
...