Java jOOQ联接选择对象
我想在SQL中执行类似的操作: 选择 * 从…起 tbl1 t1 内连接 通过t1.col2 subQ从tbl1 t1组中选择MAXcol1作为maxCol,col2 关于t1.col2=subQ.col2 t1.col1=subQ.maxCol 在jOOQ中,我将子Q存储到Select对象中: 选择subQ=myDSL.selectDSL.maxTBL1.COL1.asmaxCol,TBL1.COL2 .fromTBL1 .groupByTBL1.COL2; 我的问题是,如何从subQ获取maxCol列并在join中使用它?我的加入是这样的: 选择 .fromTBL1 .joinsubQ.asTable .onTBL1.COL1.eqsubQ.asTable.fieldmaxCol; 我在上有错误 类型字段中的方法eqString不适用于参数字段Java jOOQ联接选择对象,java,mysql,sql,jooq,Java,Mysql,Sql,Jooq,我想在SQL中执行类似的操作: 选择 * 从…起 tbl1 t1 内连接 通过t1.col2 subQ从tbl1 t1组中选择MAXcol1作为maxCol,col2 关于t1.col2=subQ.col2 t1.col1=subQ.maxCol 在jOOQ中,我将子Q存储到Select对象中: 选择subQ=myDSL.selectDSL.maxTBL1.COL1.asmaxCol,TBL1.COL2 .fromTBL1 .groupByTBL1.COL2; 我的问题是,如何从subQ获取m
我该怎么办?这解决了问题:
select().from(TBL1).join(subQ.asTable()).on(TBL1.COL1.eq((Field<DataType>) subQ.field("maxCol")));
使用MySQL 8.0
如果您使用的是MySQL 8.0+,请不要使用子查询,而是使用窗口函数。这将是与您的查询相同的查询:
挑选*
从…起
选择t1.*,按t1对分区进行排序。按col1 DESC rk对col2进行排序
从tbl1到t1
T
其中t.rk=1
优点是您只有一个tbl1访问,这可能会运行得更快
使用较旧的MySQL版本
如果通过非类型化名称字符串或从任何表访问字段,则编译器没有任何类型信息可放在结果字段上,这就是原始代码无法编译的原因
但是,您可以使用以下技术之一:
还记得原始的maxCol字段引用吗
从子查询中,计算出maxCol字段引用,并将其分配给一个局部变量(假设其类型为Integer),如果需要,请替换:
字段maxCol=DSL.maxTBL1.COL1.asmaxCol;
选择subQ=myDSL.selectmaxCol,TBL1.COL2.fromTBL1.groupByTBL1.COL2;
现在,您还可以使用此引用从子查询中提取列:
字段subQMaxCol=subQ.fieldmaxCol;
或者直接在解决方案中内联:
从TBL1中选择
.joinsubQ.asTable
.onTBL1.COL1.eqsubQ.fieldmaxCol;
以TBL1.COL1命名maxCol列
在这个特定的用例中,不引入任何新名称,而是重新使用COL1作为名称可能是有意义的:
选择subQ=myDSL.selectDSL.maxTBL1.COL1.asTBL1.COL1,TBL1.COL2
.fromTBL1
.groupByTBL1.COL2;
在这种情况下,如果没有不明确的COL1列名,则可以使用该引用从子查询中再次提取COL1字段:
从TBL1中选择
.joinsubQ.asTable
.onTBL1.COL1.eqsubQ.fieldTBL1.COL1;
使用TBL1.COL1引用的数据类型
从原始解决方案中,从子查询提取字段时只需添加数据类型:
从TBL1中选择
.joinsubQ.asTable
.onTBL1.COL1.eqsubQ.fieldmaxCol,TBL1.COL1.getDataType;
或者,强迫它:
从TBL1中选择
.joinsubQ.asTable
.onTBL1.COL1.eqsubQ.fieldmaxCol.胁迫etbl1.COL1;