JOOQ插入具有指定列的select语法

时间:2012-01-22 15:05:37

标签: java sql select insert jooq

JOOQ可以为指定的列'插入select'语法吗?我跑了几次尝试......

表格:

table1(预期插入)

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

表2

id   col1   col2   col3  
101  John   xxx    xxx     (from table2.col1)
102  xxx    xxx    xxx

表3


id   col1   col2   col3  
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显示错误消息:

The number of values must match the number of fields

任何人都知道我犯了什么问题以及如何修复我的JOOQ代码。 谢谢,支付。

参考: Example: INSERT SELECT syntax support

1 个答案:

答案 0 :(得分:4)

您使用的是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();