当前位置: 首页 > 知识库问答 >
问题:

jOOQ 3.9:在具有匹配列名的联接表上:“ORA-00918:定义不明确的列”

朱令
2023-03-14

在最新的3.9更新之后,jOOQ似乎正在使用新的Oracle12cRow_limiting_子句进行行限制,而不是使用旧的“rownum”语法。这导致在Oracle 12c中,在具有匹配列名的联接表上出现“ORA-00918:定义不明确的列”。

select
    student.name,
    school.name
from student
join school on student.schoolId = school.id
offset 0 rows fetch next 25 rows only;

然而,根据甲骨文的文件[1],新条款,

如果select列表包含名称相同的列,并且您指定了row_limiting_子句,则会发生ORA-00918错误。无论同名列是在同一个表中还是在不同的表中,都会发生此错误。

当您试图在使用row_limiting_clause时从两个连接的表中选择所有列时,这会导致问题。

如果每个列都是单独别名的,那么Record.into()可能无法自动将返回的记录转换为两个表记录。

有没有什么好的自动方法可以通过jOOQ将别名列映射到表记录中?

[1] https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702

共有3个答案

罗甫
2023-03-14

这是jOOQ 3.9(#5451)中的已知问题/回归,在jOOQ 3.9.1中已修复。作为一种解决方法,您可以使用SQLDialect。ORACLE11G恢复到旧的ROWNUM过滤仿真的限制()偏移()

湛功
2023-03-14

仅供参考,以下是我使用的将别名列映射到类型化记录的解决方案:

// following the student, school scenario from the first post

// define the prefixes
final String st_prefix = "st_";
final String sc_prefix = "sc_";

// define the tables to map to at the end
// the table names themselves aren't getting aliased in this example, but the fields are
final Table<StudentsRecord> st = STUDENTS.as(STUDENTS.getName(), field -> st_prefix + field.getName());
final Table<SchoolsRecord> sc = SCHOOL.as(SCHOOLS.getName(), field -> sc_prefix + field.getName());

// define the aliased columns
final Field<?>[] stFields = Arrays.stream(STUDENTS.fields()).map(field -> field.as(st_prefix + field.getName())).toArray(Field[]::new);
final Field<?>[] scFields = Arrays.stream(SCHOOLS.field()).map(field -> field.as(sc_prefix + field.getName())).toArray(Field[]::new);

query = context.select(stFields, scFields)
   .from(STUDENTS)
   .join(SCHOOLS).on(STUDENTS.SCHOOL_ID.equal(SCHOOLS.SCHOOL_ID)
   .offset(0)
   .limit(25);

// map the aliased columns into the tables expecting aliased columns
return query.fetchInto(record -> new Tuple2<>(record.into(st), record.into(sc)));

此解决方案依赖于jOOQ 3.9的功能“功能别名”1。这用于创建别名列可以使用记录映射到的表。into()方法。

这是我能想到的最短的解决方案——使用12c特性。

[1]https://github.com/jOOQ/jOOQ/issues/4512

王弘和
2023-03-14

两列具有相同的标识符名称,这是不允许的。

您可以对名称使用别名,如下所示:

select
    student.name student_name,
    school.name school_name
from student
join school on student.schoolId = school.id
offset 0 rows fetch next 25 rows only;
 类似资料:
  • 因此,我在使用多个临时表生成查询时遇到了一些问题。 首先,我创建了临时表。 然后我写下我的查询如下。这似乎是一个简单的查询。然而,我得到了错误“ORA-00918:列定义不明确”。我不知道是否可以连接这两个临时表,尤其是它们没有任何关系。我只想查询唯一id在DIDV表中的位置,以及标题和注释列不包含KEW字段的位置。 感谢您对理解这一点的任何帮助。 如果需要任何澄清,请告诉我。

  • 问题内容: 我刚刚在Oracle中遇到了一个奇怪的行为,我希望它会提高ORA-00918,但事实并非如此。以该查询为例。 此查询从概念上讲是在查找具有禁用触发器的表的详细信息,但是请注意,这不是我要解决的问题。这个问题不是该查询,数据字典,视图或表所独有的。据我所知,它适用于任何一组表或视图(我尝试过的两个或三个)。 无论如何,尝试运行此查询,你会得到ORA-00918,因为两者并有一个名为列,从

  • 问题内容: 我有两个表,它们共享相似的列名。 查询是: 结果放入一个数组中: 一旦我添加了第二张表,我注意到该表正在使用tableb的数据。 问题 (S):如何存储两个列,所以不起作用。我的猜测可能是我需要对查询中的每个结果进行别名化。有什么建议? 我是否应该避免将来再提供列名 ? 问题答案: 你的猜测是对的。您需要为各列创建一个,以便可以唯一地获取它, 那你现在可以打电话

  • 我在连接两个表时遇到了一些问题: 组:group_id,group_name 学生:学生标识,组标识,名字,姓氏 我想计算每个小组有多少学生,然后输出小组名称,但是当我这样写时: 出现错误“列引用”groupid“不明确”。

  • 问题内容: 该查询工作正常。但是问题是,产品表和类别表都具有名为“ name”和“ id”的字段。因此,当我获取此查询的结果时,它只给我一个名称和一个ID,但同时又需要ID和名称。 我如何做到这一点而不必重命名字段?是否可以使用自定义名称(例如product_name和category_name)返回? 问题答案: 您可以将别名添加到字段:

  • 我正在尝试连接两个数据帧。 我创建了别名并根据这篇文章引用它们:Spark Dataframe区分具有重复名称的列 但是,当它点击<code>fillna()s的信息。 但我一直有这个错误: 下面是连接的输出: 有人可以解释为什么这不起作用吗?我不想创建单独的列,因为它们应该在上加入。