postgresql数据库表结构 id,parent_id,name parent_id关联id 查询时 parent_id > 0 则不显示parent_id关联的那条父级记录
时间: 2024-03-03 21:48:28 浏览: 21
可以使用以下 SQL 语句实现:
```sql
SELECT t1.*
FROM your_table t1
LEFT JOIN your_table t2 ON t1.parent_id = t2.id
WHERE t1.parent_id = 0 OR t2.parent_id IS NULL;
```
这里使用了自连接的方式,将表自身连接两次,然后在 WHERE 子句中过滤出 parent_id 为 0 或者其对应的父级记录不存在的记录。其中,t2.parent_id IS NULL 是为了处理 parent_id 字段为 NULL 的情况。
需要注意的是,这种方式比较消耗性能,如果数据量比较大,建议在表中增加一个字段记录每条记录的层级关系,这样查询的性能会更好。
相关问题
有个postgresql自关联表存储父类子类数据,怎么获取从顶级父类到某个指定子类的路径数据
你可以使用递归查询来获取从顶级父类到指定子类的路径数据。以下是一个示例查询:
```sql
WITH RECURSIVE category_path AS (
-- 选择指定子类
SELECT id, name, parent_id
FROM categories
WHERE id = <指定子类ID>
UNION ALL
-- 递归查询父类
SELECT c.id, c.name, c.parent_id
FROM categories c
JOIN category_path cp ON c.id = cp.parent_id
)
-- 最终查询路径数据
SELECT id, name
FROM category_path
ORDER BY id;
```
在这个查询中,我们使用了一个递归的公共表表达式(RECURSIVE CTE)来获取从指定子类到顶级父类的路径数据。首先,我们选择指定子类作为起始点,然后逐级向上查询父类,直到到达顶级父类。最后,我们按照路径中的ID排序,得到完整的路径数据。
请将`categories`替换为你实际使用的表名,`<指定子类ID>`替换为你要查询的子类的ID。执行以上查询语句,你将会得到从顶级父类到指定子类的路径数据。
pgslq 实现 sys_connect_by_path
在 PostgreSQL 中,可以使用递归查询和字符串聚合函数来模拟 Oracle 的 sys_connect_by_path 函数。下面是一个示例查询,可以实现类似 sys_connect_by_path 的功能:
WITH RECURSIVE t AS (
SELECT id, parent_id, name, CAST(name AS TEXT) AS path
FROM my_table
WHERE parent_id IS NULL
UNION ALL
SELECT t.id, t.parent_id, t.name, CAST(p.path || '/' || t.name AS TEXT)
FROM my_table t
JOIN t p ON t.parent_id = p.id
)
SELECT id, parent_id, name, path FROM t;
在这个查询中,使用了 WITH RECURSIVE 关键字来进行递归查询。首先查询出所有 parent_id 为 NULL 的记录,然后使用 UNION ALL 将它们与它们的子节点合并在一起。在每个递归步骤中,使用字符串聚合函数将父节点的路径和当前节点的名称拼接在一起。最终返回所有节点的 id、parent_id、name 和路径信息。