jooq 从表的特定分区中选择

Posted

技术标签:

【中文标题】jooq 从表的特定分区中选择【英文标题】:jooq select from a particular partition of the table 【发布时间】:2018-08-04 15:09:18 【问题描述】:

在表的特定分区上执行选择查询的正确方法是什么。例如,我有一个雇员表,它在特定列上进行范围分区。

目前我这样做:

Result<Record> fetch = DSL.using(configuration())
  .select()
  .from(EMPLOYEES)
  .fetch();

执行以下sql的正确方法是什么(其中p2是一个分区)

SELECT * FROM employees PARTITION (p2);

更新 1 当我使用可更新记录时,更新/插入呢,例如:

employeeRecord.attach(configuration())
employeeRecord.update(); // or insert

我假设我可以做这样的事情,但那会处理乐观锁情况(我通过我表上的版本列使用)

DSL.using(configuration())
                    .update("0 partition (p2)", EMPLOYEES)
                    .set(EMPLOYEES.NAME, "abc")
                    .where(EMPLOYEES.ID.eq(123))
                    .execute();

【问题讨论】:

【参考方案1】:

jOOQ 目前不支持表上的PARTITION 子句。相关功能请求为:https://github.com/jOOQ/jOOQ/issues/2774

您可以使用普通的 SQL 模板 API 轻松解决此限制: https://www.jooq.org/doc/latest/manual/sql-building/plain-sql-templating

Result<Record> fetch = DSL.using(configuration())
  .select()
  .from("0 partition (p2)", EMPLOYEES)
  .fetch();

以上是为了方便:

Result<Record> fetch = DSL.using(configuration())
  .select()
  .from(DSL.table("0 partition (p2)", EMPLOYEES))
  .fetch();

【讨论】:

感谢这项工作,更新了 updatableRecords 案例的问题 @anuj:您介意再次删除更新并提出新问题吗?我不确定这些事情是否严格相关。 Stack Overflow 不会很快用完问题 ID :-)【参考方案2】:

您是否尝试过使用此处的示例,例如

create.select(t.BOOKED_AT, t.AMOUNT,
         sum(t.AMOUNT).over().partitionByOne()
                      .orderBy(t.BOOKED_AT)

https://www.jooq.org/doc/3.0/manual/sql-building/column-expressions/window-functions/

【讨论】:

OP 询问是否查询分区表,这与窗口函数完全不同(尽管使用相同的关键字)。 啊,我的错。我不确定 jooq 是否应该对此提供本机支持,因为它完全依赖于 Oracle。感谢您的正确回答! 其他数据库我没查过,但至少DB2和PostgreSQL也支持分区表。我认为支持此供应商特定功能没有问题,但它可能不是优先事项。

以上是关于jooq 从表的特定分区中选择的主要内容,如果未能解决你的问题,请参考以下文章

如何跨多个模式从表中删除分区?

从 redshift 中删除外部表的所有分区

mysql 分区PARTITIONS之基本使用

如何从表中删除分区?

MySQL:无法从特定分区中选择记录?

如何从 DB2 的特定分区中选择数据?