【问题标题】:How can I have JooQ union two different tables, that have the same columns and datatypes?如何让 JooQ 联合两个不同的表,它们具有相同的列和数据类型?
【发布时间】:2019-06-22 22:07:00
【问题描述】:

我的数据库中有两个表,这些表具有完全相同的列和数据类型,但顺序不同。

表 A 有以下列:A、B、C、D。

表 B 有以下列:A、C、D、B。

我有一个使用 JooQ 查询数据库的应用程序,它使用 Codegen 创建表和记录。但是,由于编译错误,它不允许我合并两个 select 语句。我该怎么做才能合并这两个表?

StepWhereSelect<ARecord> query = dsl.selectFrom(A);
StepWhereSelect<BRecord> query2 = dsl.selectFrom(B);
query.union(query2)

在 union 函数内部的变量上,它涉及到 SelectUnionStep 的类型不匹配,关于 union(ARecord) 不能应用于 union(BRecord)。

在 JooQ 中我可以在哪里合并这 2 个表?

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    您正在寻找的是 jOOQ 对 SQL 标准语法 UNION CORRESPONDING 的支持。我知道的任何 RDBMS 目前都没有实现该语法,但它可以很容易地被 jOOQ 模拟。在没有此语法支持的情况下,您可以使用以下代码在两个子查询中创建正确的列顺序:

    var q1 = dsl.select(Stream.of(A.fields()).sorted(Field::getName).collect(toList()))
                .from(A);
    var q2 = dsl.select(Stream.of(B.fields()).sorted(Field::getName).collect(toList()))
                .from(A);
    q1.union(q2).fetch();
    

    当然,这里不再有类型安全。如果你还想接收ARecord类型,你可以写

    q1.union(q2).fetchInto(A);
    

    【讨论】:

    • SAS SQL/U-SQL - 不完全符合标准中的规定,但想法是一样的?
    • @LukaszSzozda:类似的想法,是的
    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多