由于 VistaDB 上缺乏 CTE/递归查询,我正在尝试制定一个具有一定深度的可行查询来查询 PARENT/ID 分层自引用表。我有几个想法(SQL 来自 Firebird,因为我们在服务器端使用它):
进行多次连接,如下所示:
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
行吗?将
UNION
与子查询结合使用。但是,我无法找出可行的语法来完成此任务。也许是一种替代语法。我们只需要几个深度级别。从技术上讲,我们可以在应用程序中评估 (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/