sql - 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)
解决方案
看来您正在寻找递归查询:
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
不是唯一的,这将产生奇怪的结果
推荐阅读
- openlayers - 从geojson绘制openlayers折线
- json - 使用 jsonschema 和 robotsframework 验证 json
- c# - 无法使用 Microsoft.Azure.ServiceBus 连接到 Azure ServiceBus
- python - 设置详细的正则表达式
- c# - 如何创建不是数据库中实体的 FileUpload 视图/视图模型
- sql-server - SQL Server 中的 Max 和 Decode 转换
- angularjs - AngularJS - 子组件不更新父组件数据
- javascript - 提供 loadChildren 函数有什么好处?
- c++ - LLVM 遍历 IR 并查找对 @llvm.dbg.declare 的所有调用
- powershell - 在基于 windows server 1709 的容器内运行带有 args 的可执行文件