Sql 使用postgres与父级存在于同一个表中
我感兴趣的是查询PostgreSQL 8.4表以列出行,对于给定的行,如果它有任何具有特定字段值的相邻子行,则列出这些行 一个简单的例子是任务列表,其中任务可以有子任务,子任务是同一个表中由Sql 使用postgres与父级存在于同一个表中,sql,postgresql,Sql,Postgresql,我感兴趣的是查询PostgreSQL 8.4表以列出行,对于给定的行,如果它有任何具有特定字段值的相邻子行,则列出这些行 一个简单的例子是任务列表,其中任务可以有子任务,子任务是同一个表中由parent\u id列关联的相邻行。我想写一个查询,列出顶级任务并弹出子任务的状态。用通俗易懂的英语,“列出每一任务行的状态字段,考虑每一行的子项,如果有任何子项的状态不是“关闭的”。“一级深入的子项关系考虑很好-无需重复 以下是我到目前为止得出的结论,但即使我确定有符合条件的行,我也没有得到任何结果: S
parent\u id
列关联的相邻行。我想写一个查询,列出顶级任务并弹出子任务的状态。用通俗易懂的英语,“列出每一任务行的状态
字段,考虑每一行的子项,如果有任何子项的状态不是“关闭的”。“一级深入的子项关系考虑很好-无需重复
以下是我到目前为止得出的结论,但即使我确定有符合条件的行,我也没有得到任何结果:
SELECT id, summary, created_at
FROM tasks
WHERE parent_id IS NULL
AND EXISTS (
SELECT summary
FROM tasks
WHERE parent_id=tasks.id
AND status != 'closed'
)
ORDER BY created_at DESC;
您的方法存在的问题是,首先执行子选择:
SELECT summary
FROM tasks
WHERE parent_id=tasks.id
AND status != 'closed'
你的parent\u id=tasks.id
是一个骗人的东西。看起来您正在跨表进行比较,但实际上并没有——您正在检查每一行,其中tasks.parent\u id=tasks.id(因为这里只有一个表)。这自然意味着0行
因此,您需要消除歧义:
SELECT id, summary, created_at
FROM tasks AS parent_tasks
WHERE parent_id IS NULL
AND EXISTS (
SELECT summary
FROM tasks AS child_tasks
WHERE parent_tasks.parent_id=child_tasks.id
AND status != 'closed'
)
ORDER BY created_at DESC;
使用任务t中的别名
(…其中t.parent\u id=…和t.status)