H2 中的分层查询
Hierarchical Queries in H2
我有以下查询,在 Oracle 中运行良好:
SELECT ID
FROM PEOPLE
START WITH ID = <person_id>
CONNECT BY PRIOR PARENT_ID = ID;
这适用于包含人员的自引用 table。它会找到一个人所有祖先的 ID。
问题是我需要此查询在 H2, but H2 does not support CONNECT BY PRIOR
中也能正常工作。因此,我如何重写上面的查询,以便它同时适用于 Oracle 和 H2?
您必须对同一个 table 执行正常的内部联接。
SELECT parent.id
FROM PEOPLE parent
inner join PEOPLE child on child.parent_id = parent.id
where child.person_id = {ID}
这是一个使用 recursive queries, which are supported by both Oracle and H2 的解决方案:
WITH ancestors(ID, PARENT_ID) AS
(
SELECT ID, PARENT_ID FROM PEOPLE WHERE ID = <person_id>
UNION ALL
SELECT S2.ID, S2.SCHEDULE_PARENT_ID FROM ancestors S1 INNER JOIN EFP.COLLATERAL_SCHEDULE S2 ON S1.SCHEDULE_PARENT_ID = S2.ID
)
SELECT ID FROM ancestors;
我有以下查询,在 Oracle 中运行良好:
SELECT ID
FROM PEOPLE
START WITH ID = <person_id>
CONNECT BY PRIOR PARENT_ID = ID;
这适用于包含人员的自引用 table。它会找到一个人所有祖先的 ID。
问题是我需要此查询在 H2, but H2 does not support CONNECT BY PRIOR
中也能正常工作。因此,我如何重写上面的查询,以便它同时适用于 Oracle 和 H2?
您必须对同一个 table 执行正常的内部联接。
SELECT parent.id
FROM PEOPLE parent
inner join PEOPLE child on child.parent_id = parent.id
where child.person_id = {ID}
这是一个使用 recursive queries, which are supported by both Oracle and H2 的解决方案:
WITH ancestors(ID, PARENT_ID) AS
(
SELECT ID, PARENT_ID FROM PEOPLE WHERE ID = <person_id>
UNION ALL
SELECT S2.ID, S2.SCHEDULE_PARENT_ID FROM ancestors S1 INNER JOIN EFP.COLLATERAL_SCHEDULE S2 ON S1.SCHEDULE_PARENT_ID = S2.ID
)
SELECT ID FROM ancestors;