有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java H2:嵌套查询计数查询中的重复列名

我想知道是否可以在嵌套查询中保留表名以避免Duplicate column name错误

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

  • 客户:身份证、姓名、城市号
  • 城市:身份证、姓名、邮编

以下查询失败,错误为Duplicate column name "NAME"

SELECT COUNT(*) FROM (
  SELECT CUSTOMERS.NAME, CITY.NAME 
  FROM CUSTOMERS JOIN CITIES ON CUSTOMERS.CITY_ID = CITIES.ID
)

显然,H2会在嵌套查询中剥离表名,从而产生两个名为NAME的列 (见COUNT with subquery fail on H2 database with "Duplicate column name"

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

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


共 (1) 个答案

  1. # 1 楼答案

    问题

    这是一个已知的jOOQ问题,专门针对^{}:https://github.com/jOOQ/jOOQ/issues/7867的用法

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

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

    SELECT COUNT(*) FROM (
      SELECT CUSTOMERS.NAME AS C1, CITY.NAME AS C2
      FROM CUSTOMERS JOIN CITIES ON CUSTOMERS.CITY_ID = CITIES.ID
    )
    

    但这很棘手,因为这些列可能是从ORDER BY子句引用的(这可能是因为LIMIT/FETCH子句而需要),所以这个问题还没有解决

    解决方法

    你必须自己解决这个问题。你有3个选择:

    • 运行计数时重写查询,或者通常使用列别名重写查询
    • 手动运行普通计数查询
    • 在H2 1.4.198(今天尚未发布)中,将实现窗口函数,因此您可以投影COUNT(*) OVER ()表达式来计算每行的计数值