Иерархические запросы в Oracle: START WITH, CONNECT BY

Светлана Комарова

Светлана Комарова

Автор статьи. Системный администратор, Oracle DBA. Информационные технологии, интернет, телеком. Подробнее.

Иерархический SQL запрос в базе данных Oracle на примерахЕсли в таблице содержатся иерархические данные (данные, которые могут быть сгруппированы в уровни с размещением родительских данных на более высоких, а дочерних — на более низких уровнях), можно использовать поддерживаемые Oracle иерархические запросы. В иерархических запросах обычно применяются следующие конструкции:

  • START WITH, которая обозначает корневую строку или строки иерархического отношения;
  • CONNECT BY, которая задает отношения между родительскими и дочерними строками вместе с операций PRIOR, которая всегда указывает на родительскую строку.

В листинге ниже приведен пример иерархического отношения между столбцами сотрудников и менеджеров. Конструкция CONNECT BY указывает, как должно выглядеть это отношение, а конструкция START WITH — с какого места оператору следует начинать отслеживать иерархию.


 

SQL> SELECT employee_id, last_name, manager_id
FROM employees
START WITH manager_id = 100
CONNECT BY PRIOR employee_id = manager_id;
EMPLOYEE_ID  LAST_NAME       MANAGER_ID
-----------  --------------  ----------
        101  Reddy              100
        108  Greenberg          101
        109  Faviet             108
        110  Colon              108
        111  Chowdhary          108
        112  Urman              108
        113  Singh              108
        200  Whalen             101
SQL>

Иерархические запрос в Oracle - START WITH, CONNECT BY 

Выбор данных из нескольких таблиц

До сих пор главным образом показывалось, как выполнять различные DML-операции в отношении одиночных таблиц, в том числе с применением различных SQL-функций и выражений. В реальной жизни, однако, чаще всего требуется извлекать данные не из одной, а сразу из нескольких таблиц или представлений. При извлечении данных из нескольких таблиц, таблицы необходимо соединять (join). Под соединением подразумевается запрос, который позволяет объединять данные из таблиц, представлений и материализованных представлений. Следует отметить, что таблица может соединяться как с другими таблицами, так и сама с собой.

Соединение двух таблиц без использования сужающей выбор конструкции WHERE называется декартовым произведением (Cartesian product) или декартовым соединением (Cartesian join). При таком соединении, следовательно, вывод запроса будет содержать все строки из обеих таблиц. Ниже приведен пример декартового соединения:

SQL> SELECT * FROM employees, dept;
 

Декартово произведение двух больших таблиц практически всегда является результатом выполнения ошибочного SQL-запроса, в котором было пропущено условие соединения (join condition). За счет использования условия соединения при объединении данных из двух или более таблиц можно ограничивать количество возвращаемых строк. Это условие можно применять в конструкции WHERE или FROM и тем самым указывать, что извлекаться должны только те данные, которые удовлетворяют описанному в условии соединения условию.

Ниже приведен пример использования условия соединения в операторе соединения:

SQL> SELECT * FROM employees, dept
WHERE dept='HR';

Вас заинтересует / Intresting for you:

Oracle и Java: использование P...
Oracle и Java: использование P... 5773 просмотров sepia Tue, 08 May 2018, 08:52:34
Oracle IDE: JDeveloper, SQL De...
Oracle IDE: JDeveloper, SQL De... 4541 просмотров Ольга Потемкина Tue, 21 Nov 2017, 13:18:46
Язык PL/SQL Oracle для програм...
Язык PL/SQL Oracle для програм... 2636 просмотров Илья Дергунов Tue, 21 Nov 2017, 13:28:01
Деятельность Oracle в XML-инду...
Деятельность Oracle в XML-инду... 7957 просмотров Дэн Tue, 21 Nov 2017, 13:33:37
Войдите чтобы комментировать

ildergun аватар
ildergun ответил в теме #10721 1 год 6 мес. назад
Хороший пример и пояснение. Спасибо!