首页 > 解决方案 > 在 CREATE VIEW 内的 WITH...AS 中使用多个表表达式时出现“找不到对象”错误

问题描述

我正在尝试基于 HSQLDB(版本 2.5.1)中的复杂查询创建视图。

查询看起来像这样(为清楚起见进行了简化),还包括表的 DDL:

DROP VIEW TEST_VIEW IF EXISTS;

DROP TABLE TEST_1 IF EXISTS;
CREATE TABLE TEST_1 (
    contentid VARCHAR(10),
    contenttype VARCHAR(10),
    downloaddate TIMESTAMP
);

DROP TABLE TEST_2 IF EXISTS;
CREATE TABLE TEST_2 (
    dbid INTEGER,
    contentid VARCHAR(10),
    version VARCHAR(10)
);

CREATE VIEW TEST_VIEW AS
WITH a AS (
    SELECT CONTENTID, count(*) AS amount
    FROM TEST_2
    GROUP BY CONTENTID
),
    b AS (
        SELECT CONTENTID, amount
        FROM a
    )
SELECT b.CONTENTID, b.amount, i.DOWNLOADDATE
FROM b /* error here */
    JOIN TEST_1 i ON i.CONTENTID = b.CONTENTID
ORDER BY b.CONTENTID;

但是,它失败并出现以下错误:

[42501][-5501] 用户缺少权限或找不到对象:在语句 [CREATE VIEW TEST_VIEW AS......

当用作SELECT(不带CREATE VIEW...AS)时,相同的查询运行良好。

此外,如果语句中只有一个表表达式,则视图创建成功WITH...AS,如下所示:

CREATE VIEW TEST_VIEW AS
WITH a AS (
    SELECT CONTENTID, count(*) AS amount
    FROM TEST_2
    GROUP BY CONTENTID
)
SELECT a.CONTENTID, a.amount, i.DOWNLOADDATE
FROM a
    JOIN TEST_1 i ON i.CONTENTID = a.CONTENTID
ORDER BY a.CONTENTID;

看起来在第一条语句中,数据库引擎尝试将“JOIN”解析为表“b”的表别名。

是否有我没有注意到的语法错误,或者 HSQLDB 不支持WITH...AS内部的多个表表达式CREATE VIEW

编辑:更新示例查询以包含表 DDL 以确保完整性。

标签: sqlintellij-ideahsqldb

解决方案


HSQLDB 支持创建这种类型的视图。

由于您没有提供表定义,我尝试对 DatabaseManager 生成的测试表进行类似查询,结果成功。请报告表格。

CREATE VIEW REPORT_LINKED_IDS AS
WITH a AS (
    SELECT PRODUCTID, count(*) AS amount
    FROM ITEM
    GROUP BY PRODUCTID
),
    b AS (
        SELECT PRODUCTID, amount
        FROM a
    )
SELECT b.PRODUCTID, b.amount, i.NAME, i.PRICE
FROM b
    JOIN PRODUCT i ON i.ID = b.PRODUCTID
ORDER BY b.PRODUCTID;                  

推荐阅读