从不同架构中的表中进行选择时,“未找到列”

时间:2011-11-11 03:17:29

标签: sql database h2

我遇到了一个非常奇怪的问题。

除了驻留在默认(“PUBLIC”)模式中的所有表之外,我还在一个单独的模式中创建了几个表(这样做有一个有效的商业理由,但这里无关紧要)。我跑的时候

select * from schema1.table1

一切都很完美。如果我尝试做同样的事情,但明确提到列名,例如

select col1, col2 from schema1.table1

查询失败,显示“找不到列col1; 42S22 / 42122”错误。只要在select(from子句/ where子句/ etc ...)中的任何位置引用列,就会发生这种情况。

列名称正确,它们显示在INFORMATION_SCHEMA中。此外,如果我引用它们,查询可以正常工作 - 但是这会产生副作用,使列名称区分大小写,然后在Hibernate中失败,无论如何显然都会使它们变为大写。

我是否忽视了一些明显的东西?是否存在这种奇怪行为的原因或这是一个错误?

更新:托马斯的回答让我意识到问题不在于不同的架构,而在于如何创建该架构中的表格;特别是使用带引号的标识符。这是一个在H2 1.3.161(最新版本的atm)中重现问题的脚本:

create table table1(col1 int, "col2" int);
insert into table1 values(1, 1);
select * from table1; -- works
select col1 from table1; -- works
select "col2" from table1; -- works
select col2 from table1; -- fails

我不明白为什么最后两个查询之间存在差异。列名在此区分大小写(因为它是通过带引号的标识符定义的),但它确实具有正确的大小写。 INFORMATION_SCHEMACOLUMNS显示两列之间没有差异(除了名称)。通过强制大写所有查询获得的不带引号的列是否不区分大小写?

上述脚本在Postgres中按预期工作(如在所有查询中成功完成)。

2 个答案:

答案 0 :(得分:1)

我无法重现这个问题。你能发布一个完整的,可重现的问题吗?我在H2控制台中运行了以下脚本,它有效(意思是,我没有例外):

drop all objects;
create schema schema1;
create table schema1.table1(col1 int, col2 int);
insert into schema1.table1 values(1, 1);
select * from schema1.table1;
select col1, col2 from schema1.table1;

答案 1 :(得分:0)

我遇到了同样的问题,但在我的情况下,我在查询中错误地使用了"而不是'