У меня есть следующий запрос, который отлично работает в Oracle:

SELECT ID
FROM PEOPLE
  START WITH ID = <person_id> 
  CONNECT BY PRIOR PARENT_ID = ID;

Это работает с таблицей со ссылками на себя, которая содержит людей. Находит идентификаторы всех предков человека.

Проблема в том, что мне нужно, чтобы этот запрос также работал в H2, но H2 не поддерживает CONNECT BY PRIOR. Поэтому как я могу переписать приведенный выше запрос, чтобы он работал как с Oracle, так и с H2?

4
Vlad Schnakovszki 10 Май 2016 в 15:08

2 ответа

Лучший ответ

Вот решение с использованием рекурсивных запросов, которые поддерживаются обоими Oracle и 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;
4
Vlad Schnakovszki 10 Май 2016 в 15:19

Вы должны выполнить обычное внутреннее соединение с той же таблицей.

SELECT parent.id
FROM PEOPLE parent
inner join PEOPLE child on child.parent_id = parent.id
where child.person_id = {ID}
-1
NimChimpsky 10 Май 2016 в 12:28