- •Добряк Павел Вадимович управление данными
- •Управление данными
- • Угту-упи, 2012
- •Введение
- •1. Основные определения
- •1.1. Элементы баз данных
- •1.2. Технологии управления данными
- •1.3. Модели данных
- •2.1. Основные понятия реляционной модели
- •2.2. Нормализация
- •2. Реляционная модель
- •2.3. Проблемы проектирования реляционных баз данных
- •Задачи для самостоятельного решения
- •3. Реляционные алгебра и исчисления
- •3.1. Реляционная алгебра
- •3.2. Реляционное исчисление на кортежах
- •3.3. Реляционное исчисление на доменах
- •4.1. Введение в sql
- •4.2. Пример реляционной базы данных
- •4.3. Запросы к одной таблице
- •4.4. Запросы к нескольким таблицам
- •4.5. Вложенные запросы
- •4.6. Вложенные подзапросы и кванторы
- •4.7. Объединение однотипных запросов
- •4.8. Рекурсивные запросы
- •Объединение однотипных запросов.
- •Запросы для самостоятельного программирования
- •5. Olap и хранилища данных
- •5.1. Архитектура хранилищ данных
- •5.2. Аналитические запросы
- •6. Триггеры, хранимые процедуры, события
- •7. Транзакции
- •7.1. Функции транзакций
- •7.2. Уровни изолированности
- •7.3. Сериализация транзакций
- •7.4. Синхронизационный захват
- •7.5. Метод временных меток
- •8. Обзор перспективных направлений баз данных
- •9. Объектные технологии в субд
- •9.1. Три манифеста баз данных
- •9.2. Объектная модель sql
- •9.3. Модель данных odmg и язык oql
- •10. Запросы к интернет-страницам
- •10.1. Теговая парадигма
- •10.2. Язык запросов xQuery
- •11. Пространственные базы данных
- •12. Лабораторные работы
- •13. Курсовая работа
- •13.1. Концептуальное проектирование
- •13.2. Семантическое проектирование
- •13.3. Физическое проектирование. Реляционная модель данных
- •13.4. Запросы
- •Объединение однотипных запросов.
- •13.5. Интеллектуализация базы данных.
- •13.6. Клиентская часть информационной системы
- •13.7. Дополнительные элементы базы данных
- •Вопросы к экзамену
- •1. Основные определения.
- •2. Реляционная модель
- •3. Реляционные алгебра и исчисления
- •10. Запросы к интернет-страницам
- •11. Пространственные базы данных
- •Литература
- •Список иллюстраций список таблиц
- •Список листингов
- •Алфавитный указатель
- •Список сокращений
4.8. Рекурсивные запросы
На Лист. 25 был приведен пример запроса, в котором ищутся подчиненные Иванова. Возникает вопрос, как построить всю иерархию подчиненных, а не только его непосредственных подчиненных. Фактически мы должны применить этот же самый запрос Лист. 25 к результату выполнения его самого, затем еще раз и т.д., пока будут находиться подчиненные на всё более низких уровнях иерархии.
Построить иерархию всех подчиненных Иванова в «в длину» (запрос приведен на Лист. 41, результат -Табл. 54).
Рекурсивные запросы можно опознать по ключевому слову WITH RECURSIVE. Чтобы быть вызванным рекурсивно, запрос фактически должен иметь имя (в данном случае - Прод). Запрос состоит из двух частей, объединяемых с помощью UNION. В первой части – начальники, во второй части – их подчиненные. Запрос находит первого подчиненного, затем первого подчиненного первого и т.д. Такие запросы называются запросами на поиск «в длину»
Лист. 41. Рекурсивный запрос «в длину»
WITH RECURSIVE Прод (N, Имя) as
(SELECT N, Имя
FROM Продавцы
WHERE Имя = ‘Иванов’
UNION ALL
SELECT Продавцы. N, Продавцы.Имя
FROM Продавцы, Прод
WHERE Прод.N = Продавцы.N_Начальника);
SELECT * FROM Прод;
Табл. 54. Результат рекурсивного запроса «в длину»
34 Рекурсия «в длину» |
|
N |
Имя |
1 |
Иванов |
2 |
Петров |
4 |
Шмидт |
5 |
Зайцев |
3 |
Сидоров |
Если нам нужно сперва перечислить всех подчиненных Иванова, затем подчиненных подчиненных Иванова и т.д., то нам нужно использовать рекурсивные запросы «в ширину», используя оператор SEARCH BREADTH FIRST. В запросе с помощью оператора SET устанавливается номер итерации.
Построить иерархию всех подчиненных Иванова «в ширину» (запрос приведен на Лист. 42, результат -Табл. 55).
Лист. 42. Рекурсивный запрос «в ширину»
WITH RECURSIVE Прод (N, Имя, N_Начальника) as
(SELECT N, Имя
FROM Продавцы
WHERE Имя = ‘Иванов’
UNION ALL
SELECT Продавцы. N, Продавцы. Имя
FROM Продавцы, Прод
WHERE Прод.N = Продавцы.N_Начальника);
SEARCH BREADTH FIRST BY N_Начальника, N
SET order_column
SELECT * FROM Прод
ORDER BY order_column;
Табл. 55. Результат запроса «в ширину»
35 Рекурсия «в ширину» |
|
N |
Имя |
1 |
Иванов |
2 |
Петров |
3 |
Сидоров |
4 |
Шмидт |
5 |
Зайцев |
При рекурсивном запросе возможна ситуация зацикливания. Хотя этого и нет в нашем примере, можно предположить, что бывают ситуации, когда один коллектив работает над двумя проектами, причем один человек в первом проекте – начальник, а во втором – подчиненный и наоборот, второй человек в первом проекте – подчиненный. А во втором – начальник. В этом случае предыдущие рекурсивные запросы зациклятся.
Построить иерархию всех подчиненных Иванова, учесть возможность зацикливания (Лист. 43).
Лист. 43. Рекурсивный запрос с учетом зацикливания
WITH RECURSIVE Прод (N, Имя) as
(SELECT N, Имя
FROM Продавцы
WHERE Имя = ‘Иванов’
UNION ALL
SELECT Продавцы. N, Продавцы. Имя
FROM Продавцы, Прод
WHERE Прод.N = Продавцы .N_Начальника);
CYRCLE N
SET cyrclemark to “Y” default “N”
USING cyrclepath
SELECT * FROM Прод
ORDER BY N;
Д/З . Для примера из Д/З придумайте следующие запросы:
