I am trying to make a view for my recursive query, and use the view with a where clause to set a starting point.
CREATE TABLE dog (
id int,
name varchar(50)
)
CREATE TABLE dog_parent (
id int,
dog_id int,
parent_id int,
)
This recursive query returns what I expect
WITH recursive Ancestor_Tree AS (
SELECT
mp.dog_id,
mp.parent_id
FROM
dog_parent mp
WHERE mp.dog_id = 26
UNION ALL
SELECT
mp.dog_id,
mp.parent_id
FROM
dog_parent mp,
Ancestor_Tree ft
WHERE mp.dog_id = ft.parent_id
)
SELECT
ft.dog_id,
mm.name AS Member,
ft.parent_id,
mp.name AS Parent
FROM Ancestor_Tree ft
INNER JOIN dog mm
ON mm.id = ft.dog_id
INNER JOIN dog mp
ON mp.id = ft.parent_id
Result:
| dog_id | member | parent_id | parent |
| ------ | ---------- | --------- | -------------- |
| 33 | Beniga | 35 | Bunta |
| 33 | Beniga | 36 | Kaori |
| 26 | Rei | 33 | Beniga |
| 34 | Ginga | 37 | Gouzanhaou |
| 34 | Ginga | 38 | Ukigumo |
| 26 | Rei | 34 | Ginga |
| 38 | Ukigumo | 39 | Kumotarou |
| 38 | Ukigumo | 40 | Gintsurugihime |
| 37 | Gouzanhaou | 41 | Gyokuhou |
| 35 | Bunta | 42 | Koharu |
| 35 | Bunta | 43 | Chouhou |
| 43 | Chouhou | 44 | Kotofusa |
| 43 | Chouhou | 45 | Tsubomi |
| 36 | Kaori | 46 | Chacha |
| 46 | Chacha | 47 | Teruhide |
| 46 | Chacha | 48 | Sekihoume |
| 36 | Kaori | 49 | Kokuga |
| 49 | Kokuga | 50 | Kotokaze |
| 50 | Kotokaze | 51 | Seizanhou |
| 50 | Kotokaze | 52 | Houki |
But I want to create a VIEW
and replace the WHERE mp.dog_id = 26
with a WHERE
for the VIEW
like this:
SELECT * FROM recursive_view WHERE dog_id = 26
This is how I tried to create the view:
CREATE OR REPLACE VIEW recursive_view AS
WITH recursive Ancestor_Tree (dog_id, parent_id) AS (
SELECT
mp.dog_id as dog_id,
mp.parent_id as parent_id
FROM
dog_parent mp
UNION ALL
SELECT
mp.dog_id,
mp.parent_id
FROM
dog_parent mp,
Ancestor_Tree ft
WHERE mp.dog_id = ft.parent_id
)
SELECT
ft.dog_id,
mm.name AS Member,
ft.parent_id,
mp.name AS Parent
FROM Ancestor_Tree ft
INNER JOIN dog mm
ON mm.id = ft.dog_id
INNER JOIN dog mp
ON mp.id = ft.parent_id
But when I call it with SELECT * FROM recursive_view WHERE dog_id = 26
I only get the parents for dog 26, but not the recursive part.
Result:
| dog_id | member | parent_id | parent |
| ------ | ---------- | --------- | -------------- |
| 26 | Rei | 33 | Beniga |
| 26 | Rei | 34 | Ginga |
How can I make the VIEW
for this recursive query that accepts a WHERE
clause?