我有一张层次 struct 的表格

select * from product_categories;
 id | parent_id |     item     |     rule
----+-----------+--------------+---------------
  1 |           | ecomm        |
  2 |         1 | grocceries   |
  3 |         1 | electronics  |
  5 |         3 | TV           |
  6 |         4 | touch_screen | Rules applied
  7 |         4 | qwerty       |
  8 |         6 | iphone       |
  4 |         3 | mobile       | mobile rules

我想从iPhone遍历,一旦我遇到规则不为空的行,我就想 Select 该行并仅在此时和那里完成递归, 我正在使用这个查询,

WITH RECURSIVE items AS (
        SELECT id, item, parent_id, rule
        FROM product_categories
        WHERE item = 'iphone'
    UNION ALL
        SELECT p.id, p.item, p.parent_id, p.rule
        FROM product_categories p
        JOIN items ON p.id = items.parent_id
        WHERE p.rule is not NULL
)
SELECT * FROM items ;

给出结果,

 id |     item     | parent_id |     rule
----+--------------+-----------+---------------
  8 | iphone       |         6 |
  6 | touch_screen |         4 | Rules applied
  4 | mobile       |         3 | mobile rules

这里我想要的是,一旦找到规则列不为空的行,它就应该返回该行并完成递归, 在上面的例子中,它应该返回第二行和项‘Touch_Screen’, 但它也在打印第三行.

如何修改此查询以实现此目标

推荐答案

当当前 node 的rule不为空并且其子 node 的rule为空时,您想要停止递归:

WITH RECURSIVE items AS (
        SELECT id, item, parent_id, rule
        FROM product_categories
        WHERE item = 'iphone'
    UNION ALL
        SELECT p.id, p.item, p.parent_id, p.rule
        FROM product_categories p
        JOIN items ON p.id = items.parent_id
        WHERE p.rule IS NOT NULL
        AND items.rule IS NULL
)
SELECT * FROM items;

Sql相关问答推荐

从snowflake中的表格中删除一个完全重复的副本

PostgreSQL行级锁

如何通过比较不同表中相同ID S的值来筛选ID为S的列表?

更新在两个或多个面中具有交点的面

仅 for each 唯一ID返回一个元素,并仅返回最新连接的记录

SQL:如何查找聚合满足条件的连续日期

如何简化此PostgreSQL查询以计算平均值?

按用户和时间列出的SQL Group考勤列表

group-by-clause具有特定列,而不是oracle的toad中的all

如何修复初学者 SQL INNER JOIN 查询错误

Select 一个非零值减少重复

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

使用row_number() over partition by保留首次出现且值不为空的行的方法

IN子句使用的表值用户定义函数参数

Snowflake中的动态SQL优化

每组使用平均值来填补缺失值的SQL

Teradata 多个进程的最大进程结束时间捕获

强制 SQL 始终通过 R 从视图中返回至少一行

多列上的 SQL UNIQUE 约束 - 它们的组合必须是唯一的还是至少其中之一?

SQL 查询以填充单个列中的所有值