【发布时间】: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