问题
I have recursive query to retrieve all children of a given person
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;
As you can see, I'm specifying list of columns to be retrieved. But I want to use SELECT * (I have really many columns in real table, and they can be changed in future). Is there some way to get ALL columns without defining each column individually?
回答1:
You don't need to specify the columns in the WITH part. If you leave that out, the column names will be determined by the first query in the 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;
回答2:
quick hack-around (rejoin with the original):
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
);
来源:https://stackoverflow.com/questions/29943766/recursive-query-in-postgresql-select