我想知道是否可以在嵌套查询中保留表名,以避免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在嵌套查询中保留表名的方法吗?
答案 0 :(得分:0)
这是一个已知的jOOQ问题,特定于DSLContext.fetchCount(Select)
: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个选择:
COUNT(*) OVER ()
表达式以计算每一行的计数值。