PostgreSQL:如何筛选同表中无子行关联的记录?
在PostgreSQL中筛选无子女行的记录
要从同一张表中筛选出不存在子行的记录(子行的parent字段指向父行的id),可以通过以下几种方式实现:
示例数据
| id | value | parent |
|---|---|---|
| 1 | v1 | null |
| 2 | v2 | null |
| 3 | v3 | 1 |
期望结果
返回id为2和3的记录:
- id=1存在子行(id=3的
parent为1),因此被排除 - id=2无任何子行,符合条件
- id=3自身没有子行,符合条件
实现方法
方法1:使用NOT EXISTS子查询
这是直观且性能较好的方式,直接检查当前记录是否没有对应的子行:
SELECT t1.* FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.parent = t1.id );
方法2:使用LEFT JOIN + IS NULL
通过自连接左表和右表,筛选出没有匹配子行的记录:
SELECT t1.* FROM your_table t1 LEFT JOIN your_table t2 ON t2.parent = t1.id WHERE t2.id IS NULL;
两种方法都能得到符合期望的结果,其中NOT EXISTS在处理大数据量时通常表现更优,因为它会在找到第一个匹配项后立即停止检查。
内容的提问来源于stack exchange,提问作者olegzhermal
相关产品推荐
相关产品推荐

