首页 > 解决方案 > 如何重写递归 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 专家),我至少有两个问题:

  1. 递归查询需要是 UNION ALL 类型(似乎是一个简单的修复)
  2. 仅在最后一个 SELECT 语句中支持参数(这就是它无法解析 s.tagId 的原因)

标签: sqlsubqueryh2ignite

解决方案


推荐阅读