从几个临时表插入

时间:2019-03-04 18:35:15

标签: postgresql kotlin jooq

我想使用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 :(得分:1)

您的固定查询

// 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();