PostgreSQL,在没有可用的 ORDER BY 选项时反转递归查询
PostgreSQL, reverse a recursive query when there isn't an ORDER BY option available
我有这个递归查询,它获取一个子行并查询可能可用的每个后续父行,目前 returns 结果集按从最子到最父的顺序排列:
WITH recursive subdomains AS (
SELECT id, parent_id, domain FROM domains WHERE id = '42b2af32-21a0-4212-b634-19ec47982e6b'
UNION
SELECT d.id, d.parent_id, d.domain FROM domains d
INNER JOIN subdomains s ON s.parent_id::text=d.id::text
) SELECT * FROM subdomains
我想对此做一个完全相反的操作,这样 return 结果就会从父类最多到子类最多。添加一个递增索引列然后能够对其进行 ORDER BY 是否最有意义?
在此类查询中包含 "depth" 列通常很方便:
WITH recursive subdomains AS (
SELECT id, parent_id, domain, 1 as lev
FROM domains
WHERE id = '42b2af32-21a0-4212-b634-19ec47982e6b'
UNION ALL
SELECT d.id, d.parent_id, d.domain, s.lev + 1
FROM domains d INNER JOIN
subdomains s
ON s.parent_id::text = d.id::text -- is type conversion really necessary?
)
SELECT s.*
FROM subdomains s;
如果我没理解错的话,您可以在最后的查询中添加 ORDER BY lev DESC
。
我有这个递归查询,它获取一个子行并查询可能可用的每个后续父行,目前 returns 结果集按从最子到最父的顺序排列:
WITH recursive subdomains AS (
SELECT id, parent_id, domain FROM domains WHERE id = '42b2af32-21a0-4212-b634-19ec47982e6b'
UNION
SELECT d.id, d.parent_id, d.domain FROM domains d
INNER JOIN subdomains s ON s.parent_id::text=d.id::text
) SELECT * FROM subdomains
我想对此做一个完全相反的操作,这样 return 结果就会从父类最多到子类最多。添加一个递增索引列然后能够对其进行 ORDER BY 是否最有意义?
在此类查询中包含 "depth" 列通常很方便:
WITH recursive subdomains AS (
SELECT id, parent_id, domain, 1 as lev
FROM domains
WHERE id = '42b2af32-21a0-4212-b634-19ec47982e6b'
UNION ALL
SELECT d.id, d.parent_id, d.domain, s.lev + 1
FROM domains d INNER JOIN
subdomains s
ON s.parent_id::text = d.id::text -- is type conversion really necessary?
)
SELECT s.*
FROM subdomains s;
如果我没理解错的话,您可以在最后的查询中添加 ORDER BY lev DESC
。