使来自 oracle 的 Operator WITH 在 hsql 数据库中工作

Make Operator WITH from oracle work in hsql database

我有一个本机查询需要在 HSQL(用于内存中测试)和 Oracle DB(用于生产)中 运行,但是,查询关键字 "RECURSIVE" 在 HSQL 中是必需的数据库,在oracle中是不允许的。因为我需要两个引擎上的两个语句 运行,所以有一些常见的类似运算符?

oracle 查询是:

WITH contexts (ID, CONTEXT_ID, NAME, LABEL_KEY, VERSION, parent_name, parent_id, lev) 
AS (
  SELECT t1.ID, t1.CONTEXT_ID, t1.NAME, LABEL_KEY, VERSION, NULL AS parent_name, NULL AS parent_id, 1 AS lev
  FROM PIM_CONTEXT t1 WHERE t1.ID =1 
  UNION ALL 
  SELECT t2.ID, t2.CONTEXT_ID, t2.NAME, t2.LABEL_KEY, t2.VERSION, contexts.NAME AS parent_name, contexts.ID AS parent_id, lev + 1 AS lev 
  FROM contexts 
  JOIN PIM_CONTEXT t2 ON t2.context_id = contexts.id 
) 
SELECT ID, CONTEXT_ID, NAME, LABEL_KEY, VERSION, parent_name, parent_id FROM contexts;

并且在 HSQL 中具有相同输出的查询是:

WITH contexts recursive (ID, CONTEXT_ID, NAME, LABEL_KEY, VERSION, parent_name, parent_id, lev) 
AS (
  SELECT t1.ID, t1.CONTEXT_ID, t1.NAME, LABEL_KEY, VERSION, NULL AS parent_name, NULL AS parent_id, 1 AS lev
  FROM PIM_CONTEXT t1 WHERE t1.ID =1 
  UNION ALL 
  SELECT t2.ID, t2.CONTEXT_ID, t2.NAME, t2.LABEL_KEY, t2.VERSION, contexts.NAME AS parent_name, contexts.ID AS parent_id, lev + 1 AS lev 
  FROM contexts 
  JOIN PIM_CONTEXT t2 ON t2.context_id = contexts.id 
) 
SELECT ID, CONTEXT_ID, NAME, LABEL_KEY, VERSION, parent_name, parent_id FROM contexts;

我需要一些可以 运行 超过两个引擎的替代方案。

最新的HSQLDB代码(post 2.3.4)在Oracle语法兼容模式下支持这个。快照 jar 可从 Maven 存储库获得。

https://oss.sonatype.org/content/repositories/snapshots/org/hsqldb/hsqldb/SNAPSHOT/