首页 > 解决方案 > PostgreSQL / 解构赋值

问题描述

我在我的案例中使用了解构分配术语。一些编程语言允许我们进行多重赋值:

JavaScript:

let a, b;
[a, b] = [10, 20];

是否可以在 PostgreSQL 中进行类似的操作以避免使用重复的子查询?

我们有一个表类别

|-----------------------|---------------------------|------------------|
|      category_id      |     parent_category_id    |       name       |
|-----------------------|---------------------------|------------------|
|            1          |           NULL            |      'main'      | <= parent category
|-----------------------|---------------------------|------------------|
|            2          |             1             |      'sub1'      |
|-----------------------|---------------------------|------------------|
|            3          |             1             |      'sub2'      |
|-----------------------|---------------------------|------------------|

我们需要通过name选择唯一的子类别,但如果该名称属于父类别,则获取该父类别下的所有子类别。

in case of name = 'main' we'll get 2 categories (category IDs: 2, 3)

in case of name = 'sub2' only 1 record (category ID: 3)

有没有办法优化这个查询:

SELECT 
    c.category_id 
FROM
    categories c 
WHERE
    c.category_id = ANY 
        (SELECT c2.category_id FROM categories c2 WHERE c2.name = $1)
    OR
    c.parent_category_id = ANY 
        (SELECT c3.parent_category_id FROM categories c3 WHERE c3.name = $1)

标签: sqlpostgresql

解决方案


看来您正在寻找递归查询

with recursive tree as (
  select id, parent_id, name
  from categories
  where name = $1 --<< start with this category
  union all
  select child.id, child.parent_id, child.name
  from categories child 
     join tree parent on parent.id = child.parent_id
)
select *
from tree

请注意,如果name不是唯一的,这将产生奇怪的结果


推荐阅读