【问题标题】:Make Operator WITH from oracle work in hsql database使来自 oracle 的运算符 WITH 在 hsql 数据库中工作
【发布时间】:2017-03-10 12:43:08
【问题描述】:

我有一个需要在 HSQL(用于内存测试)和 Oracle DB(用于生产)中运行的本机查询,但是,在 HSQL 数据库中需要查询关键字“RECURSIVE”,并且在 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;

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

【问题讨论】:

  • 升级到支持递归 CTE 的 Oracle 12c。
  • 我们已经有了Oracle 12c和CTE,问题只是H2SQL数据库需要的“Recursive”关键字。
  • @GordonLinoff 递归 CTE 在 Oracle 11g 中也受支持。
  • 你能用查询和一些示例数据稍微扩展你的问题吗?
  • 我认为没有一个通用的表达式可以在两个数据库中使用。也许用您的查询在每个数据库中创建一个视图(如果可能的话),那么您的应用程序只需要查询该视图。

标签: sql oracle hsqldb common-table-expression recursive-query


【解决方案1】:

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

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

【讨论】:

  • 谢谢@fredt,我会在他们发布最终版本时更新,我不能使用SNAPSHOT。
猜你喜欢
  • 1970-01-01
  • 2017-03-14
  • 2015-11-13
  • 1970-01-01
  • 2011-11-12
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多