пятница, 29 января 2010 г.

Рекурсивные запросы в DB2

Сегодня увидел довольно занимательный пример рекурсии на DB2. В примере выполняется поиск корневого значения, а примечательным является простота и наглядность примера - дополнительных таблиц создавать не требуется.

with 

  tree (id,pid) as (
    values (1,2), (2,3), (3,4), (4, cast(null as int)), (5,3), (6,5), (7,8), (8, cast(null as int))
  ),

  rr (id,pid) as (
    select tr.id, tr.pid from tree tr where tr.id=1
      union all
    select tt.id,tt.pid from tree tt, rr
    where tt.id = rr.pid
  )

select id from rr where rr.pid is null

Поиск "корня" выполняется для значения указанного в tr.id. Для проверки tr.id=1 можно например заменить на tr.id=7.

Источник: db2 SQL: value(), values(), with, recursive SQL // selectorweb.com.