1

我正在尝试将专有的 OracleCONNECT BY查询转换为将在 H2 上运行的标准 SQL 查询,并以相同的顺序生成相同的数据。

这是 Oracle 查询,它有效:

SELECT id, name, parent
        FROM myschema.mytable 
        START WITH id = 1 
        CONNECT BY PRIOR id = parent

这就是我想出的 - 但是,它在ResultSet.

WITH RECURSIVE T(id, name, parent, path) AS (
    SELECT id, name, '' AS parent, id AS path 
    FROM myschema.mytable WHERE id = 1
    UNION ALL
    SELECT ou.id, ou.name, ou.parent, 
        (T.path + '.' + CAST (ou.id AS VARCHAR)) AS path 
    FROM T INNER JOIN myschema.mytable AS ou ON T.id = ou.parent
) SELECT id, name, parent FROM T ORDER BY path

初始行和相关行都存在于表中。

我没有使用 H2 的 Oracle 兼容模式(顺便说一下,它不支持 CONNECT BY)。

4

2 回答 2

3

以下对我有用,适用于 H2 和 PostgreSQL(您可以使用 SQL Fiddle 在线测试)。我不得不做出一些改变和假设(见下文):

create table mytable(id int, name varchar(255), parent int);
insert into mytable values(1, 'root', null), (2, 'first', 1), 
(3, 'second', 1), (4, '2b', 3);

WITH RECURSIVE T(id, name, parent, path) AS (
SELECT id, name, 0 AS parent, 
    cast(id as varchar) AS path 
FROM mytable WHERE id = 1
UNION ALL
SELECT ou.id, ou.name, ou.parent, 
    (T.path || '.' || CAST (ou.id AS VARCHAR)) AS path 
FROM T INNER JOIN mytable AS ou ON T.id = ou.parent
) SELECT id, name, parent, path FROM T ORDER BY path

变化:

  • 我假设idparent是整数。因此,我不得不cast(id as varchar)在第一个选择中使用。
  • 我在连接字符串时替换+为。||
  • 我用过0 AS parent
于 2013-10-30T19:19:16.403 回答
1

这似乎是 Anorm 数据库访问库或 JDBC 驱动程序没有正确替换查询参数的问题(问题中没有显示查询替换,因为我认为它不相关)。

于 2013-10-31T11:12:21.807 回答