PostgreSQL中的递归查询。SELECT *

10
我有一个递归查询,用于检索给定人员的所有子级。
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;

正如您所看到的,我正在指定要检索的列列表。但是我想使用 SELECT *(实际表中有很多列,并且它们可能会在将来更改)。是否有一种方法可以获取所有列而不必逐个定义每个列?

您可以使用 SELECT * 来检索所有列。例如:

SELECT * FROM table_name;

这将返回表中的所有列。

2个回答

10

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;

你的更干净!我不知道中间的CTE对象“变胖”会不会影响性能,(我担心会)。 - wildplasser
@wildplasser:只有一个 explain (analyze, verbose) 可以告诉你 ;) - user330315
但是我太懒了,不想设置测试环境。我得输入所有的列名!http://www.catb.org/jargon/html/R/recursion.html - wildplasser
3
我刚刚检查了一下,我的直觉是正确的。数据有10万行(22列,每行大约650字节); 我的处理时间为439.704毫秒,而你的处理时间为15984.338毫秒。 - wildplasser

7

快速 hack-around(与原始内容重新连接):

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
    );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接