jOOQ - 按原样渲染IN而不是EXISTS

时间:2015-02-05 16:33:00

标签: java db2 jooq

我需要使用“IN”谓词进行查询,但是,jOOQ将“IN”渲染为“EXISTS”+ 2x嵌套选择。 但是,在DB2上,“IN”要快得多(500ms vs 8s)。我如何强制jOOQ使我的“IN”谓词与我通过DSL API描述的方式完全相同?

示例代码:

try (Connection connection = DriverManager.getConnection("jdbc:h2:mem:")) {
  Settings settings = new Settings().withRenderFormatted(true);
  DSLContext ctx = DSL.using(connection, SQLDialect.SQL99, settings);
  ctx
    .createTable("FOOBAR")
    .column("FOO", SQLDataType.INTEGER)
    .column("BAR", SQLDataType.INTEGER)
    .execute();
  String sql = ctx
    .select()
    .from(DSL.tableByName("FOOBAR"))
    .where(
        DSL.row(DSL.fieldByName("FOO")).in(ctx
            .select(DSL.fieldByName("BAR"))
            .from(DSL.tableByName("FOOBAR"))
        )
    )
    .getSQL();
    System.out.println(sql);
}

结果:

select *
from "FOOBAR"
where exists (
  select "alias_2"."alias_2_0"
  from (
    select "BAR"
    from "FOOBAR"
  ) "alias_2"("alias_2_0")
  where ("FOO") = ("alias_2"."alias_2_0")
)

1 个答案:

答案 0 :(得分:2)

SQLDialect.SQL99方言未被明智地命名。它表明它将生成应该在任何数据库上运行的SQL,但这不正确。它只会生成“默认”SQL。这将在jOOQ 3.6:#3844

中得到纠正

为了优化用于DB2数据库的SQL生成,您应该使用SQLDialect.DB2方言。你在这里遇到的问题不会是唯一的......