"Object not found" 在 WITH...AS 内部的 CREATE VIEW 中使用多个 table 表达式时出错
"Object not found" error when using multiple table expressions in WITH...AS inside of CREATE VIEW
我正在尝试在 HSQLDB(版本 2.5.1)中创建一个基于复杂查询的视图。
查询如下所示(为清楚起见进行了简化),还包括 table 的 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] user lacks privilege or object not found: JOIN in statement [CREATE VIEW TEST_VIEW AS......
相同的查询在用作 SELECT
(没有 CREATE VIEW...AS
)时运行良好。
另外,如果WITH...AS
语句中只有一个table表达式,则视图创建成功,如下所示:
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”解析为 table“b”的 table 别名。
有语法错误我没有注意到,还是HSQLDB不支持WITH...AS
inside CREATE VIEW
中的多个table表达式?
编辑: 更新示例查询以包含 table DDL 以确保完整性。
HSQLDB 支持创建这种类型的视图。
由于您没有提供 table 定义,我尝试使用 DatabaseManager 生成的测试 tables 进行类似查询,结果成功。请报告 tables。
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;
感谢@fredt 的建议,我已经确认问题出在 IntelliJ IDEA (2020.1) 中尝试使用此查询。当使用另一个工具(在我的例子中是 DbVisualizer)时,查询工作正常并且在同一个数据库中成功创建了视图。此外,在 DB 中创建视图后,IntelliJ IDEA 在尝试连接到该 DB 时在同一个词“JOIN”上抛出异常 - 错误类似于:The specified database user/password combination is rejected: org.hsqldb.HsqlException: unexpected token: NOT。与上述问题中的评论类似,我已通过手动编辑 .script 文件从错误中恢复。
至少有 2 个可能的选项可以解决此问题:
第一个解决方案: 重构 SQL 查询,使其在 WITH 子句中只有一个 table。在我的例子中,我只是将第一个 table 移动到 FROM 子句中的 select 表达式,如下所示:
CREATE VIEW TEST_VIEW AS
WITH b AS (
SELECT CONTENTID, amount
FROM (
SELECT CONTENTID, count(*) AS amount
FROM TEST_2
GROUP BY CONTENTID
)
)
SELECT b.CONTENTID, b.amount, i.DOWNLOADDATE
FROM b
JOIN TEST_1 i ON i.CONTENTID = b.CONTENTID
ORDER BY b.CONTENTID;
第二个解决方案:使用不同的工具处理数据库,或者在 IDEA 中修复问题。
我正在尝试在 HSQLDB(版本 2.5.1)中创建一个基于复杂查询的视图。
查询如下所示(为清楚起见进行了简化),还包括 table 的 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] user lacks privilege or object not found: JOIN in statement [CREATE VIEW TEST_VIEW AS......
相同的查询在用作 SELECT
(没有 CREATE VIEW...AS
)时运行良好。
另外,如果WITH...AS
语句中只有一个table表达式,则视图创建成功,如下所示:
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”解析为 table“b”的 table 别名。
有语法错误我没有注意到,还是HSQLDB不支持WITH...AS
inside CREATE VIEW
中的多个table表达式?
编辑: 更新示例查询以包含 table DDL 以确保完整性。
HSQLDB 支持创建这种类型的视图。
由于您没有提供 table 定义,我尝试使用 DatabaseManager 生成的测试 tables 进行类似查询,结果成功。请报告 tables。
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;
感谢@fredt 的建议,我已经确认问题出在 IntelliJ IDEA (2020.1) 中尝试使用此查询。当使用另一个工具(在我的例子中是 DbVisualizer)时,查询工作正常并且在同一个数据库中成功创建了视图。此外,在 DB 中创建视图后,IntelliJ IDEA 在尝试连接到该 DB 时在同一个词“JOIN”上抛出异常 - 错误类似于:The specified database user/password combination is rejected: org.hsqldb.HsqlException: unexpected token: NOT。与上述问题中的评论类似,我已通过手动编辑 .script 文件从错误中恢复。
至少有 2 个可能的选项可以解决此问题:
第一个解决方案: 重构 SQL 查询,使其在 WITH 子句中只有一个 table。在我的例子中,我只是将第一个 table 移动到 FROM 子句中的 select 表达式,如下所示:
CREATE VIEW TEST_VIEW AS
WITH b AS (
SELECT CONTENTID, amount
FROM (
SELECT CONTENTID, count(*) AS amount
FROM TEST_2
GROUP BY CONTENTID
)
)
SELECT b.CONTENTID, b.amount, i.DOWNLOADDATE
FROM b
JOIN TEST_1 i ON i.CONTENTID = b.CONTENTID
ORDER BY b.CONTENTID;
第二个解决方案:使用不同的工具处理数据库,或者在 IDEA 中修复问题。