代码之家  ›  专栏  ›  技术社区  ›  Robin Green

H2中的递归CTE:未返回数据

  •  1
  • Robin Green  · 技术社区  · 11 年前

    我正在尝试转换一个专有的Oracle CONNECT 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)。

    2 回复  |  直到 11 年前
        1
  •  3
  •   Thomas Mueller    11 年前

    以下内容适用于我,适用于H2和PostgreSQL( this you can test online using the 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
    

    变化:

    • 我认为 id parent 是整数。正因为如此,我不得不使用 cast(id as varchar) 在第一次选择中。
    • 我替换 + 具有 || 连接字符串时。
    • 我用过 0 AS parent .
        2
  •  1
  •   Robin Green    11 年前

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