PostgreSQL中的递归查询。选择 *

MyT*_*tle 7 postgresql recursion

我有递归查询来检索给定人的所有孩子

WITH RECURSIVE recursetree(id, parent_id) AS (
    SELECT id, parent_id FROM tree WHERE parent_id = 0
  UNION
    SELECT t.id, t.parent_id
    FROM tree t
    JOIN recursetree rt ON rt.id = t.parent_id
  )
SELECT * FROM recursetree;
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在指定要检索的列的列表。但是我想使用SELECT *(实际表中确实有很多列,以后可以更改它们)。有没有某种方法可以获取ALL列而不单独定义每个列?

a_h*_*ame 8

您不需要在WITH部件中指定列。如果您忽略这一点,列名将由 中的第一个查询确定UNION

WITH RECURSIVE recursetree AS (
    SELECT * FROM tree WHERE parent_id = 0
  UNION
    SELECT t.*
    FROM tree t
    JOIN recursetree rt ON rt.id = t.parent_id
)
SELECT * 
FROM recursetree;
Run Code Online (Sandbox Code Playgroud)

  • 我刚查过。我的直觉是对的。100K 行(22 列,行大小 ~650);我的:439.704ms,你的:15984.338ms (2认同)

wil*_*ser 5

快速破解(重新加入原版):

WITH RECURSIVE recursetree(id, parent_id) AS (
    SELECT id, parent_id FROM tree WHERE parent_id = 0
  UNION
    SELECT t.id, t.parent_id
    FROM tree t
    JOIN recursetree rt ON rt.id = t.parent_id
  )
SELECT *
FROM tree tr
WHERE EXISTS ( SELECT 1
    FROM recursetree x
    WHERE x.id = tr.id
    );
Run Code Online (Sandbox Code Playgroud)