我使用以下查询获得了包含数据集的BIRT报告
select id, parentId from objectTable where id=?
查询中使用的id是通过BIRT参数传递的,并根据我得到的结果我想找到parentObject。执行上述查询后,我想检查是否存在parentObject,并通过检查上面查询中的parentId值来执行此操作,如果它不为零则存在父对象。所以我不得不说
while (parentId > 0)
select id, parentId from objectTable where id=parentId
然后我需要继续循环,直到parentId为零,我知道我有最大的祖先。
有没有办法在数据集上使用Javascript来执行此操作?或者可能是一个嵌套的sql语句,它允许我做这样的事情?
答案 0 :(得分:1)
recursive CTE可以在一个查询中为您完成此操作:
WITH RECURSIVE cte AS (
SELECT id, parentid
FROM objecttable
WHERE id = ?
UNION ALL
SELECT o.id, o.parentid
FROM cte c
JOIN objecttable o ON o.id = c.parentid
WHERE c.parentid > 0
)
SELECT *
FROM cte
WHERE parent_id = 0;
对数据库服务器的单次往返通常很多更便宜
克洛斯利相关案件:
Tree Structure and Recursion