【问题标题】:COUNT with subquery fail on H2 database with "Duplicate column name"带有“重复列名”的 H2 数据库上的子查询 COUNT 失败
【发布时间】:2018-04-27 05:22:10
【问题描述】:

当使用子查询查询 COUNT 时,我们发现 H2 的奇怪行为。

准备表格:

CREATE TABLE Foo
(
  id INT PRIMARY KEY AUTO_INCREMENT,
  fieldName VARCHAR(30) NOT NULL,
);

测试简单查询(工作正常):

SELECT F1.id, F2.id from Foo as F1 INNER JOIN Foo F2 on F1.id = F2.id

用 count 测试相同的查询:

SELECT count(*) FROM (
  SELECT F1.id, F2.id from Foo as F1 INNER JOIN Foo F2 on F1.id = F2.id
) q;

出现以下错误:

[42S21][42121] 列名“ID”重复; SQL 语句: 选择计数(*) FROM (

有什么解决方法吗?

更新: 问题在于在准备子查询列名时删除了原始表名,实际上我有:

SELECT count(*) FROM (
  SELECT id, id from q
); 

添加别名(如Abdul Rasheed 所述)可解决问题。

【问题讨论】:

  • 两列 F1.id, F2.id 都有名字是 id,所以你要使用别名。例如选择 F1.id 作为 id1,F2.id 作为 id2 ...
  • 这种连接没有意义。

标签: sql h2


【解决方案1】:

我不明白为什么要使用同一个字段和同一个表和别名。 你为什么不简单地使用这样的查询:

SELECT count(id) FROM Foo

【讨论】:

  • 这只是一个简化的例子。同样的问题: SELECT count(*) FROM ( SELECT F1.id, F2.id from Foo1 as F1 INNER JOIN Foo2 F2 on F1.id = F2.id ) q;
【解决方案2】:

此问题与 H2 无关,但在所有 SQL 数据库中都会发生。允许顶级 SQL SELECT 语句以相同的名称投影两列,但子查询 - 特别是派生表 - 不允许。这与是否曾经引用过子查询中不明确的列名无关。

解决方案是为您的列显式别名:

SELECT count(*) FROM (
  SELECT f1.id AS f1_id, f2.id AS f2_id 
  FROM foo AS f1 
  INNER JOIN foo f2 ON f1.id = f2.id
) q;

或者完全避免派生表中的投影,因为您不需要它来计算计数值:

SELECT count(*) FROM (
  SELECT 1
  FROM foo AS f1 
  INNER JOIN foo f2 ON f1.id = f2.id
) q;

此时,您显然可以完全避免派生表:

SELECT count(*) 
FROM foo AS f1 
INNER JOIN foo f2 ON f1.id = f2.id;

使用 H2 1.4.198 或更高版本时的替代方法是使用窗口函数来计算每行的计数值:

SELECT f1.id AS f1_id, f2.id AS f2_id, count(*) OVER ()
FROM foo AS f1 
INNER JOIN foo f2 ON f1.id = f2.id

【讨论】:

    猜你喜欢
    • 2021-06-04
    • 2022-01-19
    • 2019-03-13
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    相关资源
    最近更新 更多