我们有一个Projects表,其中项目可以由projectA.parent_id = projectB.id嵌套.

当 Select 所有符合给定标准的项目时,如果父母双方都满足(或父母满足),我们如何 Select only个,如果子元素满足,我们如何 Select only个子元素?

id parent_id is_chosen
1 null false
2 1 true
3 2 true
4 1 false
5 4 false
6 1 false
7 6 true
8 1 true
9 8 false
SELECT p.id 
FROM "Projects" p
JOIN "Projects" parent
ON p.parent_id = p.id
WHERE is_chosen = true
  AND ...

结果应该是2,7,8,而不是2,3,7,8.3将被排除,因为其父对象2已被选中.

为了实现这一目标,AND人中应该包括哪些内容,或者应该对其进行重组?

推荐答案

您可以合并两个查询,一个用于父查询,一个用于子查询.例如:

select distinct *
from (
  select p.* -- finding parents
  from projects p
  join projects c on c.parent_id = p.id
  where p.is_chosen
 union all
  select c.* -- finding children
  from projects p
  join projects c on c.parent_id = p.id
  where not p.is_chosen and c.is_chosen
) x

结果:

 id  parent_id  is_chosen 
 --- ---------- --------- 
 2   1          t         
 8   1          t         
 7   6          t         

参见db<>fiddle处的示例.

Sql相关问答推荐

按postquist中的日期查询json列

获取家谱树中第一次出现的特定信息,然后停止

我如何计算字母a出现的字符串的次数?

SQL查询每个客户的最新条目

使用sede获取不一定有两个不同标签的所有问题

SQL -滞后于上一个非重复值

如何在postgres函数中插入后返回布尔值?

重新组合已排序的日期范围

最近3个月收到的邮箱总数

根据最大值为字母数字大小写分配数值

用于从第二个表中提取具有最小最终价格值的记录的SQL查询

如何使用Clickhouse的COUNT聚合返回所有列,但GROUP BY是这些列的子集

如何在 SNOSQL 中执行反连接(或 where 子句过滤)以查找字段不包含另一个表中的值的行?

Postgresql - WHERE 中的 MAX 标准 - 初学者问题

PostgreSQL:从多个字段收集特定指标的最后一个条目

什么是 100.它与 100 有什么区别?

使用给定的变量对在循环中执行更新语句

计算 PostgreSQL 中的平均会话长度

如何从 2 个 SQLite 表构建嵌套对象?

在 sql 中合并系列以删除重复项