Вставить из нескольких временных таблиц - PullRequest
0 голосов
/ 04 марта 2019

Я хочу переписать следующий запрос, используя jooq:

with first_temp as (
  select a.id as lie_id
  from first_table a
  where a.some_Field = 100160
), second_temp as (
  select b.id as ben_id
  from second_table b
  where b.email = 'some.email@gmail.com'
) insert into third_table (first_table_id, second_table_id)
select a.lie_id, b.ben_id from first_temp a, second_temp b;

Я пытался что-то вроде следующего:

DriverManager.getConnection(url, login, password).use {
    val create = DSL.using(it, SQLDialect.POSTGRES)
    create.with("first_temp").`as`(create.select(FIRST_TABLE.ID.`as`("lie_id")))
            .with("second_temp").`as`(create.select(SECOND_TABLE.ID.`as`("ben_id")))
            .insertInto(THIRD_TABLE, THIRD_TABLE.FIRST_TABLE_ID, THIRD_TABLE.SECOND_TABLE_ID)
            .select(create.select().from("first_temp", "second_temp"), create.select().from("second_temp")))
}

Но без успеха.

1 Ответ

0 голосов
/ 05 марта 2019

Ваш фиксированный запрос

// You forgot FROM and WHERE clauses in your CTEs!
create.with("first_temp").`as`(
         create.select(FIRST_TABLE.ID.`as`("lie_id"))
               .from(FIRST_TABLE)
               .where(FIRST_TABLE.SOME_FIELD.eq(100160)))
      .with("second_temp").`as`(
         create.select(SECOND_TABLE.ID.`as`("ben_id"))
               .from(SECOND_TABLE)
               .where(SECOND_TABLE.EMAIL.eq("some.email@gmail.com")))
      .insertInto(THIRD_TABLE, THIRD_TABLE.FIRST_TABLE_ID, THIRD_TABLE.SECOND_TABLE_ID)

// You had too many queries in this part of the statement, and
// didn't project the two columns you were interested int
      .select(create.select(
                       field(name("first_temp", "lie_id")),
                       field(name("second_temp", "ben_id")))
                    .from("first_temp", "second_temp"))

// Don't forget this ;-)
      .execute();

Но, честно говоря, зачем вообще использовать CTE?Ваш запрос будет намного проще, как в SQL, так и в jOOQ (при условии, что вы действительно хотите этот декартовой продукт):

Лучшая версия SQL

insert into third_table (first_table_id, second_table_id)
select a.id, b.id 
from first_table a, second_table b
where a.some_field = 100160
and b.email = 'some.email@gmail.com';

Лучшая версия jOOQ

create.insertInto(THIRD_TABLE, THIRD_TABLE.FIRST_TABLE_ID, THIRD_TABLE.SECOND_TABLE_ID)
      .select(create.select(FIRST_TABLE.ID, SECOND_TABLE.ID)
                    .from(FIRST_TABLE, SECOND_TABLE)
                    .where(FIRST_TABLE.SOME_FIELD.eq(100160))
                    .and(SECOND_TABLE.EMAIL.eq("some_email@gmail.com")))
      .execute();
...