Java H2:使用嵌套查询的计数查询中存在重复的列名

Java H2:使用嵌套查询的计数查询中存在重复的列名,java,sql,database,h2,jooq,Java,Sql,Database,H2,Jooq,我想知道是否可以在嵌套查询中保留表名以避免重复列名错误 作为一个简单的例子,我有以下表格: 客户:身份证、姓名、城市号 城市:ID、姓名、邮编 以下查询失败,错误为列名重复: 从中选择COUNT* 选择CUSTOMERS.NAME、CITY.NAME 来自客户在CUSTOMERS.CITY\u ID=CITIES.ID上加入城市 显然,H2在嵌套查询中去掉了表名,从而产生了两列名为NAME 看 解决方案是在嵌套查询中使用列别名,但由于其他项目要求,我希望避免使用列别名,例如,我希望使用Jooq生

我想知道是否可以在嵌套查询中保留表名以避免重复列名错误

作为一个简单的例子,我有以下表格:

客户:身份证、姓名、城市号 城市:ID、姓名、邮编 以下查询失败,错误为列名重复:

从中选择COUNT* 选择CUSTOMERS.NAME、CITY.NAME 来自客户在CUSTOMERS.CITY\u ID=CITIES.ID上加入城市 显然,H2在嵌套查询中去掉了表名,从而产生了两列名为NAME 看

解决方案是在嵌套查询中使用列别名,但由于其他项目要求,我希望避免使用列别名,例如,我希望使用Jooq生成的列标识符来构建查询

您知道强制H2在嵌套查询中保留表名的方法吗?

问题 这是一个已知的jOOQ问题,具体涉及以下用途:

它与H2无关,但发生在所有数据库中,因为所有数据库都允许在顶级选择中使用重复的列名,但在派生表中不允许

jOOQ应按如下方式消除您的列名歧义:

从中选择COUNT* 选择CUSTOMERS.NAME作为C1,CITY.NAME作为C2 来自客户在CUSTOMERS.CITY\u ID=CITIES.ID上加入城市 但这很棘手,因为列可能是从ORDERBY子句引用的,这可能是由于LIMIT/FETCH子句而必需的,因此问题尚未解决

权变措施 你必须自己解决这个问题。您有3种选择:

运行计数时重写查询,或者通常使用列别名重写查询 手动运行普通计数查询 在今天尚未发布的H2 1.4.198中,将实现窗口函数,因此您可以投影COUNT*OVER表达式来计算每行的计数值。
如何创建jOOQ查询?@LukasEder我们使用jOOQ DSL构建查询,然后使用DSL.fetchCountquery计算查询返回的行数。谢谢@Lukas。我们实现了选项1,创建一个具有明确列名的视图,然后查询该视图。