我的数据库中有两个表,这些表具有相同的确切列和数据类型,但顺序不同。
表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的类型不匹配有关,有关about(ARecord)不能应用于union(BRecord)。
在JooQ中我可以在哪里合并这两个表?
答案 0 :(得分: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);