Using a recursive query, I'm querying for all ancestors of a field using a parent id field. If a false value is found in the enabled field for any ancestor, then the query should return empty rows.
Say I have the following table called my_table
| Field | Type |
|---|---|
| id | integer |
| parent | integer |
| enabled | boolean |
It's populated with the following data:
| id | parent | enabled |
|---|---|---|
| 1 | null | true |
| 2 | 1 | true |
| 3 | 1 | true |
| 4 | 2 | true |
I have the following recursive query:
WITH recursive my_rec AS
(
SELECT id, parent, enabled
FROM my_table
WHERE id = 4
UNION ALL
SELECT t.id, t.parent, t.enabled
FROM my_table t
INNER JOIN my_rec
ON t.id = my_rec.parent
)
SELECT *
FROM my_rec
For id = 4 this correctly returns
| id | parent | enabled |
|---|---|---|
| 4 | 2 | true |
| 2 | 1 | true |
| 1 | null | true |
But say I were to update id 2 so that it's changed from enabled true to false.
Example:
| id | parent | enabled |
|---|---|---|
| 1 | null | true |
| 2 | 1 | false |
| 3 | 1 | true |
| 4 | 2 | true |
Now I want my query to return for id = 4 nothing. This is because in the "ancestry" tree of id 4, enabled is false for id 2.
How can I update my query above to achieve this?