jOOQ - 按原样渲染 IN 而不是 EXISTS
jOOQ - Render IN as is instead of EXISTS
我需要使用 "IN" 谓词进行查询,但是,jOOQ 将我的 "IN" 呈现为 "EXISTS" + 2x 嵌套选择。
但是,在 DB2 上,"IN" 快得多(500 毫秒对 8 秒)。我如何强制 jOOQ 完全按照我通过 DSL API 描述的方式呈现我的 "IN" 谓词?
示例代码:
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")
)
SQLDialect.SQL99
方言的命名不合理。它表明它将在任何数据库上生成 SQL 应该 运行 ,但这是不正确的。它只会生成 "default" SQL。这将在 jOOQ 3.6 中得到纠正:#3844
为了优化 SQL 生成以用于 DB2 数据库,您应该改用 SQLDialect.DB2
方言。您在这里遇到的问题不会是唯一的...
我需要使用 "IN" 谓词进行查询,但是,jOOQ 将我的 "IN" 呈现为 "EXISTS" + 2x 嵌套选择。 但是,在 DB2 上,"IN" 快得多(500 毫秒对 8 秒)。我如何强制 jOOQ 完全按照我通过 DSL API 描述的方式呈现我的 "IN" 谓词?
示例代码:
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")
)
SQLDialect.SQL99
方言的命名不合理。它表明它将在任何数据库上生成 SQL 应该 运行 ,但这是不正确的。它只会生成 "default" SQL。这将在 jOOQ 3.6 中得到纠正:#3844
为了优化 SQL 生成以用于 DB2 数据库,您应该改用 SQLDialect.DB2
方言。您在这里遇到的问题不会是唯一的...