使用WITH RECURSIVE在树中查找空类别

时间:2019-04-16 15:25:14

标签: postgresql

要删除没有分配产品的商店类别,我尝试使用WITH RECURSIVE来获得既没有直接产品分配也没有子类别已分配产品的所有类别。

包括以下表格:

  • 类别(所有类别的固定列表)
  • category_node(类别树,具有针对儿童/父母的自我参考)
  • product_category(产品与类别的关系)

我想到了以下查询:

WITH RECURSIVE used_nodes AS (
    (SELECT id_category_node, fk_category, fk_parent_category_node
     FROM category_node
     WHERE fk_category IN (SELECT fk_category FROM product_category)
    )
    UNION
    (SELECT c.id_category_node, c.fk_category, c.fk_parent_category_node
     FROM category_node c
              INNER JOIN used_nodes u ON u.id_category_node = c.fk_parent_category_node
    )
)
SELECT fk_category
FROM category_node
WHERE fk_category NOT IN (
    SELECT fk_category
    FROM used_nodes
);

我希望该查询做什么:

  1. 获取具有产品关系的所有类别
  2. 递归获取这些类别的父类别,直到我们达到最高类别级别
  3. 将收集的类别的ID与所有类别的ID进行比较
  4. 返回未包含在我们的收藏夹中的ID

我真正得到的东西看起来像是类别ID的混合集合。我已经尝试过此查询的几种不同变体,但结果看上去永远都不正确。

0 个答案:

没有答案