Выбрать всех прямых начальников сотрудницы DIANE G. ADAMS
Запрос:
1 declare namespace mySpace = "http://khpi-iip/derev"
2 define function mySpace:getManager($a as element(employee)*)
3 as element(employee)* {
4 for $b in doc('file:///c:/KING/kingx/king_corp.xml')//employee
5 where $b/@id = $a/manager_id
6 return ($a, $b, mySpace:getManager($b))
7 }
8 for $a in doc('file:///c:/KING/kingx/king_corp.xml')//employee[name='DIANE G. ADAMS']
9 return mySpace:getManager($a)/name/text()
Результат:
|
Это рекурсивный запрос. Мы должны выбрать саму DIANE G. ADAMS, потом - ее начальника, потом - его начальника и т.д.
В SQL это не предусмотрено в стандарте SQL/96. Разные СУБД используют разные средства
для решения этой задачи, стандарт SQL/2000 решает ее при помощи рекурсивных временных представлений.
Здесь мы используем рекурсивную функцию. Сначала разберем формальный синтаксис этого запроса:
- Строка 1 - определение пространства имен и его префикса для функции. Пространство
по умолчанию применяется для стандартных функций.
- Строка 2 - заголовок функции с ее параметрами и их типами и с типом возвращаемого значения.
- Строки 3-7 - тело функции.
- Строки 8-9 - запрос, в котором вызывается функция.
Теперь - о семантике запроса.
Функция получает элемент сотрудника, выбирает его менеджера и возвращает
полученного сотрудника, менеджера и тот результат, который вернула эта же функция
при вызове ее с параметром - менеджером. Все это образует последовательность (берется в круглые скобки).
|