【问题标题】:jooq select from a particular partition of the tablejooq 从表的特定分区中选择
【发布时间】: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();

【问题讨论】:

    标签: java jooq


    【解决方案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也支持分区表。我认为支持此供应商特定功能没有问题,但它可能不是优先事项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 2021-11-02
    • 2022-06-16
    相关资源
    最近更新 更多