sql - 如何重写递归 SQL 查询以使用 Ignite SQL 查询
问题描述
我正在将一个项目从使用 hibernate/postgres 迁移到使用配置为使用 postgres 作为持久存储的 Apache Ignite 缓存。
我对以下导致此错误的查询有疑问:
javax.cache.CacheException:无法解析查询。未找到“S.TAGID”列;SQL 语句:
代码:
WITH RECURSIVE reportIdList AS
(
SELECT reportId, tagId, owner
FROM "MyReportPojoCache".MyReportPojo
WHERE id = ANY (SELECT id
FROM "MyOtherReportPojoCache".MyOtherReportPojo
WHERE owner IS NOT NULL
AND isManage IS TRUE
AND type = 'tag-group')
UNION
SELECT m.reportId, m.tagId, m.owner
FROM "MyReportPojoCache".MyReportPojo m
INNER JOIN reportIdList s ON s.tagId = m.reportId
AND s.owner IS NOT NULL
AND s.owner != 'admin'
AND s.owner = m.owner
)
SELECT qpIntId
FROM "MyReportPojoCache".MyReportPojo
WHERE (report_id, owner) IN (SELECT report_id, owner FROM reportIdList)
从阅读看来,原因似乎在本文档中进行了解释,并且 Ignite 在 Inner Join 之后无法解析 reportIdList 的列。
因此,我尝试了以下修改,但得到了以下错误。
有没有办法重组这个查询,以便 Ignite 可以理解?
子查询不是单列查询;SQL 语句:
WITH RECURSIVE reportIdList AS
(
SELECT reportId,tagId,owner
FROM "MyReportPojoCache".MyReportPojo
WHERE id = ANY (SELECT id FROM "MyOtherReportPojoCache".MyOtherReportPojo
WHERE owner IS NOT NULL
AND isManage IS TRUE
AND type = 'tag-group')
UNION
SELECT m.reportId, m.tagId, m.owner
FROM "MyReportPojoCache".MyReportPojo m
INNER JOIN "MyReportPojoCache".MyReportPojo s ON s.tagId = m.reportId
AND s.owner IS NOT NULL
AND s.owner != 'admin'
AND s.owner = m.owner
)
SELECT qpIntId
FROM "MyReportPojoCache".MyReportPojo
WHERE (reportId, owner) IN (SELECT reportId, owner FROM reportIdList)
更新:我尝试了@alamar 的建议,并尝试将查询作为本地查询远程运行,但仍然得到相同的结果。进一步阅读后,我认为问题在于 H2 对递归查询的支持而不是 Ignite。
据我所知(我不是 sql 专家),我至少有两个问题:
- 递归查询需要是 UNION ALL 类型(似乎是一个简单的修复)
- 仅在最后一个 SELECT 语句中支持参数(这就是它无法解析 s.tagId 的原因)
解决方案
推荐阅读
- javascript - ecma262中的赋值表达式
- python - Python Crash Course - Project Alien Invasion - 第 13 章问题
- r - 提取第 n 次出现的两个符号之间的字符串
- javascript - 如何允许用户创建新页面并将其保存在服务器端?
- fastify - Fastify 模式无法验证嵌套对象的属性类型
- c++ - 如何修改此二叉搜索树 ADT 以实现优先队列 ADT?
- spring-boot - @ControllerAdvice 不抛出异常
- c - 在 C 语言中使用 for 循环查找偶数
- c# - 如何在播放另一个声音时停止循环音效c#
- reactjs - 反应 axios 请求返回 indext.html