jOOQ - 插入的多字段

3

我想表达以下INSERT语句:

context.insertInto(TABLE A)
   .set(<FIELD A, FIELD B>, context.select(FIELD A, FIELD B).from(B).where(...))
   .set(... other field of table A ...)
   .set(... other field of table A ...)
   .set(... other field of table A ...)
   .returning()
   .fetch()

子查询返回一个有两列(FIELD AFIELD B)的行,需要将其插入到目标表TABLE A中。这样做的原因是<FIELD A,FIELD B>TABLE B的主键。TABLE A引用了TABLE B(外键)。
这种操作是否可行?

1
有趣,这在哪个数据库中可以实现? - Lukas Eder
好问题:)。如果您只使用jOOQ,并期望jOOQ能够翻译所有内容,那么就会出现这种情况。在普通的SQL中确实不可能做到这一点。 - user4597030
这给了我一个很好的理由,最终将这些复合主键重构为单一主键。之后我可以使用 DSL.field(... select ...),并将此 select field 作为普通字段插入。这样,我只需要一组字段,使代码更加简洁易懂。 - user4597030
如果你只使用jOOQ,并期望jOOQ能够翻译所有内容,就会出现这种情况。我也是这么想的 - 太强大了 :) 虽然,在这种情况下,我认为转换可能会相当困难... 是的,对于单个PK字段,您可以使用INSERT .. VALUES(或jOOQ的等效INSERT .. SET)语法来完成 - 尽管复合主键也很有用,出于性能原因(请参见:http://www.databasesoup.com/2015/01/tag-all-things.html)。 - Lukas Eder
有趣的阅读,谢谢。 - user4597030
1个回答

0

我不确定在任何SQL方言中是否首先可以通过INSERT .. VALUES实现,但您肯定可以使用INSERT .. SELECT表达这种类型的查询:

INSERT INTO a (a, b, x, y, z)
SELECT a, b, ... other value ..., ... other value ..., ... other value ...
FROM b
WHERE ...
RETURNING *;

或者使用 jOOQ

context.insertInto(TABLE A, ... columns ...)
       .select(
           select(
               FIELD A, 
               FIELD B,
               ... other field of table A ...,
               ... other field of table A ...,
               ... other field of table A ...)
          .from(B)
          .where(...))
       )
       .returning()
       .fetch()

嗨,Lukas。在select之后似乎无法使用returning函数。请参见http://stackoverflow.com/questions/32028601/jooq-insert-into-select-returning。 - user4597030
@KevinDeGrote:你说得对。感谢指出这一点。这将通过#3779在jOOQ 3.7中得到修复(https://github.com/jOOQ/jOOQ/issues/3779),这就是为什么我保留这个答案的原因。 - Lukas Eder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接