Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jOOQ联接选择对象_Java_Mysql_Sql_Jooq - Fatal编程技术网

Java jOOQ联接选择对象

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

我想在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不适用于参数字段


我该怎么办?

这解决了问题:

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;