如何解决在 CREATE VIEW
我正在尝试基于 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] 用户缺少权限或找不到对象:JOIN 语句 [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 以确保完整性。
解决方法
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;
,
感谢@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 子句中只有一个表。就我而言,我只是将第一个表移动到 FROM 子句中的选择表达式,如下所示:
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,i.DOWNLOADDATE
FROM b
JOIN TEST_1 i ON i.CONTENTID = b.CONTENTID
ORDER BY b.CONTENTID;
第二个解决方案:使用不同的工具来处理数据库,或者在 IDEA 中修复问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。