postgresql与递归抓取整个表

时间:2015-11-04 22:09:45

标签: sql postgresql categorization

我有以下postgresql结构

\d brand_categories;
                                Table "public.brand_categories"
        Column        |  Type   |                           Modifiers
----------------------+---------+---------------------------------------------------------------
 id                   | integer | not null default nextval('brand_categories_id_seq'::regclass)
 category_code        | text    | not null
 correlation_id       | uuid    | not null default uuid_generate_v4()
 created_by_id        | integer | not null
 updated_by_id        | integer | not null
 parent_category_code | text    |

我试图通过WITH RECURSIVE获取某个类别的所有父母和孩子但不接受某个类别的兄弟姐妹。我尝试执行以下操作(在ruby代码中):

WITH RECURSIVE included_categories(category_code) AS (
  SELECT category_code FROM brand_categories
    WHERE category_code = 'beer'
  UNION ALL
    SELECT children.category_code FROM brand_categories AS parents, brand_categories AS children
      WHERE parents.category_code = children.parent_category_code AND parents.category_code != 'alcohol'
    UNION SELECT parents.category_code FROM brand_categories AS children, brand_categories AS parents
      WHERE parents.category_code = children.parent_category_code
)
SELECT * from included_categories

问题在于,尽管大多数类别完全不相关,但它需要整个类别。这个查询有什么问题吗?

请注意,这是一个深度为2或3的简单分类。

1 个答案:

答案 0 :(得分:0)

我的老板帮助我解决了这个问题,它更有意义分为两部分:

  • 找到所有父母
  • 找到所有孩子

这是sql:

WITH RECURSIVE children_of(category_code) AS (
  SELECT category_code FROM brand_categories WHERE parent_category_code = 'alcohol'
  UNION ALL
    SELECT brand_categories.category_code FROM brand_categories
    JOIN children_of ON brand_categories.parent_category_code = children_of.category_code
),
parents_of(parent_category_code) AS (
  SELECT parent_category_code FROM brand_categories WHERE category_code = 'alcohol'
  UNION
    SELECT brand_categories.parent_category_code FROM parents_of
    JOIN brand_categories ON brand_categories.category_code = parents_of.parent_category_code
)
SELECT category_code FROM (SELECT * FROM children_of UNION SELECT parent_category_code FROM parents_of) t0(category_code)
  WHERE category_code IS NOT NULL