2015-08-12 4 views
2

Я хотел бы выразить следующее INSERT заявление:jOOQ - многопрофильное для вставки

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 A и FIELD B), которые должны быть вставлены в мишень TABLE A. Причиной этого является то, что <FIELD A, FIELD B> является основным ключом TABLE B. TABLE A ссылается на TABLE B (внешний ключ).

Возможно ли это?

+1

Интересно, в какой базе данных это возможно? –

+0

Хороший вопрос :). Это происходит, если вы используете только jOOQ и ожидаете, что jOOQ сможет перевести все. Это невозможно в простом SQL. –

+0

Это дает мне повод для окончательного реорганизации этих составных первичных ключей в отдельные первичные ключи. Я могу использовать 'DSL.field (... select ...)' впоследствии и просто вставить это 'select field' как простое поле, если я не ошибаюсь. Таким образом, у меня есть только набор полей, что делает код намного проще. –

ответ

1

Я не уверен, если это возможно с любым 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() 
+0

Привет, Лукас. Функция 'return', похоже, не доступна после' select'. См. Также http://stackoverflow.com/questions/32028601/jooq-insert-into-select-returning. –

+0

@KevinDeGrote: Ты прав. Спасибо за указание на это. Это будет [исправлено в jOOQ 3.7 через # 3779] (https://github.com/jOOQ/jOOQ/issues/3779), поэтому я оставляю этот ответ так, как есть. –

+0

Спасибо! Сейчас я попробую обходное решение. –

Смежные вопросы