sql - 无CTE的分层查询

标签 sql vistadb

由于 VistaDB 上缺乏 CTE/递归查询,我正在尝试制定一个具有一定深度的可行查询来查询 PARENT/ID 分层自引用表。我有几个想法(SQL 来自 Firebird,因为我们在服务器端使用它):

  1. 进行多次连接,如下所示:

    SELECT
        "A"."ID",
        "B"."ID",
        "C"."ID",
        "D"."ID"
    
    FROM "NAVIGATION" AS A
        LEFT JOIN "NAVIGATION" AS B ON (B.PARENT = A.ID)
        LEFT JOIN "NAVIGATION" AS C ON (C.PARENT = B.ID)
        LEFT JOIN "NAVIGATION" AS D ON (D.PARENT = C.ID)
    
    WHERE "A"."ID" = CHAR_TO_UUID('00000000-0000-0000-0000-000000000000');
    

    然后对 A、B、C、D“ID”列进行 COALESCE,并将其用作实际行的子查询或联接源以获取所需的内容。但是,由于第一级的第一行可能会连接到其他几行,所以这是行不通的 - 我需要的是这样的:

    A       B       C      D
    0       NULL    NULL   NULL
    0       1       NULL   NULL
    0       1       2      NULL
    0       1       2      3
    0       1       2      4
    0       1       2      5
    

    相反 - 正如预期的 - 我得到了这个:

    A       B       C      D
    0       1       2      3
    0       1       2      4
    0       1       2      5
    

    有什么方法可以获取额外的 NULL 行吗?

  2. UNION 与子查询结合使用。但是,我无法找出可行的语法来完成此任务。

  3. 也许是一种替代语法。我们只需要几个深度级别。从技术上讲,我们可以在应用程序中评估 (1.) 的结果,但我更喜欢更优雅的方法,尽管它不必非常快。我们通常只会在客户端查询两到三层深度,有时只查询一层。不过,最好不要按照程序进行。

根据要求提供一些示例数据:

ID    PARENT    TITLE
0     NULL      'Root Node'
1     0         '1st Level Node'
2     1         '2nd Level Node'
3     2         '3nd Level Node 1'
4     2         '3nd Level Node 2'
5     2         '3nd Level Node 3'

最佳答案

如果您有示例数据,将会有所帮助。但是,如果其他表中有匹配的行,则查询无法返回 A/NULL/NULL/NULL .

获取所有层次结构的一种方法是为每个连接添加一个 NULL 值:

SELECT "A"."ID", "B"."ID", "C"."ID", "D"."ID"
FROM "NAVIGATION" AS A LEFT JOIN
     (SELECT N.PARENT, N.ID
      FROM "NAVIGATION"
      UNION ALL
      SELECT NULL, NULL
     ) B
     ON B.PARENT = A.ID
     (SELECT N.PARENT, N.ID
      FROM "NAVIGATION"
      UNION ALL
      SELECT NULL, NULL
     ) C
     ON C.PARENT = B.ID LEFT JOIN
     (SELECT N.PARENT, N.ID
      FROM "NAVIGATION"
      UNION ALL
      SELECT NULL, NULL
     ) D
     ON D.PARENT = C.ID
WHERE "A"."ID" = CHAR_TO_UUID('00000000-0000-0000-0000-000000000000');

关于sql - 无CTE的分层查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33943448/

相关文章:

database - 获取 VistaDB 中列的 'Identity' 设置

.net - Sybase Sql Anywhere 能否像 VistaDB(或 MSAccess)一样部署?

sql-server - VistaDB有什么缺点

sql - 删除文本 blob 中的空行

sql - 在sql server查询中添加列值

sql - 如何获得每天最高金额前 2 名

sql - 上个月获取日期

SQL 子查询返回超过 1 个值